diff --git a/Example/E01_gpio_demo/libraries/doc/version.txt b/Example/E01_gpio_demo/libraries/doc/version.txt index b841b50..d644136 100644 --- a/Example/E01_gpio_demo/libraries/doc/version.txt +++ b/Example/E01_gpio_demo/libraries/doc/version.txt @@ -1,3 +1,8 @@ +V3.2.6 + 更新逐飞助手接口函数 调用初始化时直接传参通信类 + 更新wifi SPI驱动文件 提高通信效率 + 更新GPS驱动文件,更名为GNSS,兼容普通定位模块及RTK + V3.2.5 修复延时函数初始化参数及中断向量表问题 V3.2.4 diff --git a/Example/E01_gpio_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h b/Example/E01_gpio_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h index 28ff689..371e6b6 100644 --- a/Example/E01_gpio_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h +++ b/Example/E01_gpio_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h @@ -34,7 +34,7 @@ /*------------------------------------------Configuration for IfxScu_cfg.h-------------------------------------------*/ /*********************************************************************************************************************/ /* External oscillator frequency in Hz */ -#define IFX_CFG_SCU_XTAL_FREQUENCY (20000000) /* Allowed values are: 16000000, 20000000 or 40000000 */ +#define IFX_CFG_SCU_XTAL_FREQUENCY (20000000) /* Allowed values are9p: 16000000, 20000000 or 40000000 */ /* PLL frequency in Hz */ #define IFX_CFG_SCU_PLL_FREQUENCY (200000000) /* Allowed values are: 80000000, 133000000, 160000000 * or 200000000 */ diff --git a/Example/E01_gpio_demo/libraries/zf_common/zf_common_clock.c b/Example/E01_gpio_demo/libraries/zf_common/zf_common_clock.c index 5023270..9872ea9 100644 --- a/Example/E01_gpio_demo/libraries/zf_common/zf_common_clock.c +++ b/Example/E01_gpio_demo/libraries/zf_common/zf_common_clock.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_clock * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_common/zf_common_clock.h b/Example/E01_gpio_demo/libraries/zf_common/zf_common_clock.h index 9face65..2b50396 100644 --- a/Example/E01_gpio_demo/libraries/zf_common/zf_common_clock.h +++ b/Example/E01_gpio_demo/libraries/zf_common/zf_common_clock.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_clock * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_common/zf_common_debug.c b/Example/E01_gpio_demo/libraries/zf_common/zf_common_debug.c index 52c623d..d680265 100644 --- a/Example/E01_gpio_demo/libraries/zf_common/zf_common_debug.c +++ b/Example/E01_gpio_demo/libraries/zf_common/zf_common_debug.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_debug * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -46,7 +46,7 @@ static volatile uint8 zf_debug_assert_enable = 1; #if DEBUG_UART_USE_INTERRUPT // 如果启用 debug uart 接收中断 uint8 debug_uart_buffer[DEBUG_RING_BUFFER_LEN]; // 数据存放数组 uint8 debug_uart_data; -fifo_obj_struct debug_uart_fifo; +fifo_struct debug_uart_fifo; #endif //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E01_gpio_demo/libraries/zf_common/zf_common_debug.h b/Example/E01_gpio_demo/libraries/zf_common/zf_common_debug.h index 881a297..4fb4d91 100644 --- a/Example/E01_gpio_demo/libraries/zf_common/zf_common_debug.h +++ b/Example/E01_gpio_demo/libraries/zf_common/zf_common_debug.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_debug * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_common/zf_common_fifo.c b/Example/E01_gpio_demo/libraries/zf_common/zf_common_fifo.c index b010d3e..94f5133 100644 --- a/Example/E01_gpio_demo/libraries/zf_common/zf_common_fifo.c +++ b/Example/E01_gpio_demo/libraries/zf_common/zf_common_fifo.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_fifo * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -45,7 +45,7 @@ // 使用示例 fifo_head_offset(fifo, 1); // 备注信息 本函数在文件内部调用 用户不用关注 也不可修改 //------------------------------------------------------------------------------------------------------------------- -static void fifo_head_offset (fifo_obj_struct *fifo, uint32 offset) +static void fifo_head_offset (fifo_struct *fifo, uint32 offset) { fifo->head += offset; @@ -63,7 +63,7 @@ static void fifo_head_offset (fifo_obj_struct *fifo, uint32 offset) // 使用示例 fifo_end_offset(fifo, 1); // 备注信息 本函数在文件内部调用 用户不用关注 也不可修改 //------------------------------------------------------------------------------------------------------------------- -static void fifo_end_offset (fifo_obj_struct *fifo, uint32 offset) +static void fifo_end_offset (fifo_struct *fifo, uint32 offset) { fifo->end += offset; @@ -80,7 +80,7 @@ static void fifo_end_offset (fifo_obj_struct *fifo, uint32 offset) // 使用示例 fifo_clear(fifo); // 备注信息 清空当前 FIFO 对象的内存 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_clear (fifo_obj_struct *fifo) +fifo_state_enum fifo_clear (fifo_struct *fifo) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -113,7 +113,7 @@ fifo_state_enum fifo_clear (fifo_obj_struct *fifo) // 使用示例 uint32 len = fifo_used(fifo); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 fifo_used (fifo_obj_struct *fifo) +uint32 fifo_used (fifo_struct *fifo) { zf_assert(fifo != NULL); return (fifo->max - fifo->size); // 返回当前 FIFO 缓冲区中数据个数 @@ -127,7 +127,7 @@ uint32 fifo_used (fifo_obj_struct *fifo) // 使用示例 zf_log(fifo_write_element(&fifo, data) == FIFO_SUCCESS, "fifo_write_byte error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat) +fifo_state_enum fifo_write_element (fifo_struct *fifo, uint32 dat) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -171,7 +171,7 @@ fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat) // 使用示例 zf_log(fifo_write_buffer(&fifo, data, 32) == FIFO_SUCCESS, "fifo_write_buffer error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 length) +fifo_state_enum fifo_write_buffer (fifo_struct *fifo, void *dat, uint32 length) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -286,7 +286,7 @@ fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 leng // 使用示例 zf_log(fifo_read_element(&fifo, data, FIFO_READ_ONLY) == FIFO_SUCCESS, "fifo_read_byte error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operation_enum flag) +fifo_state_enum fifo_read_element (fifo_struct *fifo, void *dat, fifo_operation_enum flag) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -348,7 +348,7 @@ fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operat // 使用示例 zf_log(fifo_read_buffer(&fifo, data, &length, FIFO_READ_ONLY) == FIFO_SUCCESS, "fifo_read_buffer error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) +fifo_state_enum fifo_read_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) { zf_assert(NULL != fifo); zf_assert(NULL != length); @@ -447,7 +447,7 @@ fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *leng // 如果使用 FIFO_READ_AND_CLEAN 操作 将会丢弃所有数据并清空整个 FIFO // 如果使用 FIFO_READ_AND_CLEAN 操作 将会丢弃所有数据并清空整个 FIFO //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) +fifo_state_enum fifo_read_tail_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) { zf_assert(NULL != fifo); zf_assert(NULL != length); @@ -541,7 +541,7 @@ fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 // 使用示例 fifo_init(&user_fifo, user_buffer, 64); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_init (fifo_obj_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size) +fifo_state_enum fifo_init (fifo_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; diff --git a/Example/E01_gpio_demo/libraries/zf_common/zf_common_fifo.h b/Example/E01_gpio_demo/libraries/zf_common/zf_common_fifo.h index 5cc7668..901a913 100644 --- a/Example/E01_gpio_demo/libraries/zf_common/zf_common_fifo.h +++ b/Example/E01_gpio_demo/libraries/zf_common/zf_common_fifo.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_fifo * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -91,17 +91,17 @@ typedef struct uint32 end; // 缓存尾指针 总是指向非空缓存(缓存全空除外) uint32 size; // 缓存剩余大小 uint32 max; // 缓存总大小 -}fifo_obj_struct; +}fifo_struct; -fifo_state_enum fifo_clear (fifo_obj_struct *fifo); -uint32 fifo_used (fifo_obj_struct *fifo); +fifo_state_enum fifo_clear (fifo_struct *fifo); +uint32 fifo_used (fifo_struct *fifo); -fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat); -fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 length); -fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operation_enum flag); -fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); -fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); +fifo_state_enum fifo_write_element (fifo_struct *fifo, uint32 dat); +fifo_state_enum fifo_write_buffer (fifo_struct *fifo, void *dat, uint32 length); +fifo_state_enum fifo_read_element (fifo_struct *fifo, void *dat, fifo_operation_enum flag); +fifo_state_enum fifo_read_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); +fifo_state_enum fifo_read_tail_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); -fifo_state_enum fifo_init (fifo_obj_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size); +fifo_state_enum fifo_init (fifo_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size); #endif diff --git a/Example/E01_gpio_demo/libraries/zf_common/zf_common_font.c b/Example/E01_gpio_demo/libraries/zf_common/zf_common_font.c index c816f9d..ee1df09 100644 --- a/Example/E01_gpio_demo/libraries/zf_common/zf_common_font.c +++ b/Example/E01_gpio_demo/libraries/zf_common/zf_common_font.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_font * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_common/zf_common_font.h b/Example/E01_gpio_demo/libraries/zf_common/zf_common_font.h index 24b8602..7531250 100644 --- a/Example/E01_gpio_demo/libraries/zf_common/zf_common_font.h +++ b/Example/E01_gpio_demo/libraries/zf_common/zf_common_font.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_font * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_common/zf_common_function.c b/Example/E01_gpio_demo/libraries/zf_common/zf_common_function.c index d403fb5..acf2739 100644 --- a/Example/E01_gpio_demo/libraries/zf_common/zf_common_function.c +++ b/Example/E01_gpio_demo/libraries/zf_common/zf_common_function.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_function * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_common/zf_common_function.h b/Example/E01_gpio_demo/libraries/zf_common/zf_common_function.h index f5683e1..101b58a 100644 --- a/Example/E01_gpio_demo/libraries/zf_common/zf_common_function.h +++ b/Example/E01_gpio_demo/libraries/zf_common/zf_common_function.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_function * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_common/zf_common_headfile.h b/Example/E01_gpio_demo/libraries/zf_common/zf_common_headfile.h index aa06ef8..86762db 100644 --- a/Example/E01_gpio_demo/libraries/zf_common/zf_common_headfile.h +++ b/Example/E01_gpio_demo/libraries/zf_common/zf_common_headfile.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_headfile * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -82,7 +82,7 @@ //===================================================外接设备驱动层=================================================== #include "zf_device_absolute_encoder.h" #include "zf_device_bluetooth_ch9141.h" -#include "zf_device_gps_tau1201.h" +#include "zf_device_gnss.h" #include "zf_device_camera.h" #include "zf_device_dl1a.h" #include "zf_device_dl1b.h" @@ -108,6 +108,7 @@ //====================================================应用组件层==================================================== #include "seekfree_assistant.h" +#include "seekfree_assistant_interface.h" //====================================================应用组件层==================================================== //=====================================================用户层====================================================== diff --git a/Example/E01_gpio_demo/libraries/zf_common/zf_common_interrupt.c b/Example/E01_gpio_demo/libraries/zf_common/zf_common_interrupt.c index 61058b2..af12fe0 100644 --- a/Example/E01_gpio_demo/libraries/zf_common/zf_common_interrupt.c +++ b/Example/E01_gpio_demo/libraries/zf_common/zf_common_interrupt.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_interrupt * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_common/zf_common_interrupt.h b/Example/E01_gpio_demo/libraries/zf_common/zf_common_interrupt.h index 99b0e53..f828423 100644 --- a/Example/E01_gpio_demo/libraries/zf_common/zf_common_interrupt.h +++ b/Example/E01_gpio_demo/libraries/zf_common/zf_common_interrupt.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_interrupt * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_common/zf_common_typedef.h b/Example/E01_gpio_demo/libraries/zf_common/zf_common_typedef.h index bd09f30..9a07c92 100644 --- a/Example/E01_gpio_demo/libraries/zf_common/zf_common_typedef.h +++ b/Example/E01_gpio_demo/libraries/zf_common/zf_common_typedef.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_typedef * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_components/seekfree_assistant.c b/Example/E01_gpio_demo/libraries/zf_components/seekfree_assistant.c index a196e10..0b7cb9d 100644 --- a/Example/E01_gpio_demo/libraries/zf_components/seekfree_assistant.c +++ b/Example/E01_gpio_demo/libraries/zf_components/seekfree_assistant.c @@ -1,49 +1,71 @@ /********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ -#include "zf_common_fifo.h" + +#include "zf_common_debug.h" + #include "seekfree_assistant.h" -seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 -static seekfree_assistant_camera_struct seekfree_assistant_camera_data; // 图像上位机协议数据 -static seekfree_assistant_camera_dot_struct seekfree_assistant_camera_dot_data; // 图像上位机打点协议数据 -static seekfree_assistant_camera_buffer_struct seekfree_assistant_camera_buffer; // 图像以及边界缓冲区信息 -static fifo_obj_struct seekfree_assistant_fifo; -static uint8 seekfree_assistant_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE]; // 数据存放数组 -float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 保存接收到的参数 -vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 参数更新标志位 +extern uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length); +extern uint32 seekfree_assistant_receive (uint8 *buff, uint32 length); + +#if (1 == SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE) +#include "zf_common_fifo.h" +static uint8 seekfree_assistant_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE]; // FIFO缓冲区 +static fifo_struct seekfree_assistant_fifo = // FIFO结构体 +{ + .buffer = seekfree_assistant_buffer, + .execution = FIFO_IDLE, + .type = FIFO_DATA_8BIT, + .head = 0, + .end = 0, + .size = SEEKFREE_ASSISTANT_BUFFER_SIZE, + .max = SEEKFREE_ASSISTANT_BUFFER_SIZE, +}; +#endif + +static seekfree_assistant_camera_struct seekfree_assistant_camera_data; // 图像上位机协议数据 +static seekfree_assistant_camera_dot_struct seekfree_assistant_camera_dot_data; // 图像上位机打点协议数据 +static seekfree_assistant_camera_buffer_struct seekfree_assistant_camera_buffer; // 图像以及边界缓冲区信息 + +seekfree_assistant_transfer_callback_function seekfree_assistant_transfer_callback = seekfree_assistant_transfer; // 数据发送函数指针 +seekfree_assistant_receive_callback_function seekfree_assistant_receive_callback = seekfree_assistant_receive; // 数据接收函数指针 + +seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 +float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 保存接收到的参数 +vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 参数更新标志位 //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手求和函数 @@ -87,7 +109,7 @@ void seekfree_assistant_camera_data_send (seekfree_assistant_image_type_enum cam seekfree_assistant_camera_data.image_height = height; // 首先发送帧头、功能、摄像头类型、以及宽度高度等信息 - seekfree_assistant_transfer((const uint8 *)&seekfree_assistant_camera_data, sizeof(seekfree_assistant_camera_struct)); + seekfree_assistant_transfer_callback((const uint8 *)&seekfree_assistant_camera_data, sizeof(seekfree_assistant_camera_struct)); // 根据摄像头类型计算图像大小 switch(camera_type) @@ -111,9 +133,8 @@ void seekfree_assistant_camera_data_send (seekfree_assistant_image_type_enum cam // 发送图像数据 if(NULL != image_addr) { - seekfree_assistant_transfer(image_addr, image_size); + seekfree_assistant_transfer_callback(image_addr, image_size); } - } //------------------------------------------------------------------------------------------------------------------- @@ -139,16 +160,15 @@ void seekfree_assistant_camera_dot_send (seekfree_assistant_camera_buffer_struct dot_bytes *= 2; } - // 首先发送帧头、功能、边界编号、坐标长度、点个数 - seekfree_assistant_transfer((const uint8 *)&seekfree_assistant_camera_dot_data, sizeof(seekfree_assistant_camera_dot_struct)); + seekfree_assistant_transfer_callback((const uint8 *)&seekfree_assistant_camera_dot_data, sizeof(seekfree_assistant_camera_dot_struct)); for(i=0; i < SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY; i++) { // 判断是否发送横坐标数据 if(NULL != buffer->boundary_x[i]) { - seekfree_assistant_transfer((const uint8 *)buffer->boundary_x[i], dot_bytes); + seekfree_assistant_transfer_callback((const uint8 *)buffer->boundary_x[i], dot_bytes); } // 判断是否发送纵坐标数据 @@ -156,10 +176,9 @@ void seekfree_assistant_camera_dot_send (seekfree_assistant_camera_buffer_struct { // 如果没有纵坐标数据,则表示每一行只有一个边界 // 指定了横纵坐标数据,这种方式可以实现同一行多个边界的情况,例如搜线算法能够搜索出回弯。 - seekfree_assistant_transfer((const uint8 *)buffer->boundary_y[i], dot_bytes); + seekfree_assistant_transfer_callback((const uint8 *)buffer->boundary_y[i], dot_bytes); } } - } //------------------------------------------------------------------------------------------------------------------- @@ -193,7 +212,7 @@ void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struc // 数据在调用本函数之前,由用户将需要发送的数据写入seekfree_assistant_oscilloscope_data.data[] - seekfree_assistant_transfer((const uint8 *)seekfree_assistant_oscilloscope, packet_size); + seekfree_assistant_transfer_callback((const uint8 *)seekfree_assistant_oscilloscope, packet_size); } //------------------------------------------------------------------------------------------------------------------- @@ -364,12 +383,14 @@ void seekfree_assistant_camera_send (void) } } + //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手解析接收到的数据 // 参数说明 void // 返回参数 void // 使用示例 函数只需要放到周期运行的PIT中断或者主循环即可 //------------------------------------------------------------------------------------------------------------------- +#if (1 == SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE) void seekfree_assistant_data_analysis (void) { uint8 temp_sum; @@ -380,14 +401,13 @@ void seekfree_assistant_data_analysis (void) uint32 temp_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE / 4]; // 尝试读取数据, 如果不是自定义的传输方式则从接收回调中读取数据 - read_length = seekfree_assistant_receive((uint8 *)temp_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); + read_length = seekfree_assistant_receive_callback((uint8 *)temp_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); if(read_length) { // 将读取到的数据写入FIFO fifo_write_buffer(&seekfree_assistant_fifo, (uint8 *)temp_buffer, read_length); } - while(sizeof(seekfree_assistant_parameter_struct) <= fifo_used(&seekfree_assistant_fifo)) { read_length = sizeof(seekfree_assistant_parameter_struct); @@ -416,21 +436,11 @@ void seekfree_assistant_data_analysis (void) } } - // 丢弃无需使用的数据 fifo_read_buffer(&seekfree_assistant_fifo, (uint8 *)temp_buffer, &read_length, FIFO_READ_AND_CLEAN); } } - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 逐飞助手 初始化 -// 参数说明 -// 返回参数 void -// 使用示例 -//------------------------------------------------------------------------------------------------------------------- -ZF_WEAK void seekfree_assistant_init () -{ - fifo_init(&seekfree_assistant_fifo, FIFO_DATA_8BIT, seekfree_assistant_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); -} +#endif + diff --git a/Example/E01_gpio_demo/libraries/zf_components/seekfree_assistant.h b/Example/E01_gpio_demo/libraries/zf_components/seekfree_assistant.h index d02abb1..ae0f67c 100644 --- a/Example/E01_gpio_demo/libraries/zf_components/seekfree_assistant.h +++ b/Example/E01_gpio_demo/libraries/zf_components/seekfree_assistant.h @@ -1,69 +1,75 @@ -/*/********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +/********************************************************************************************************************* +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ #ifndef _seekfree_assistant_h_ #define _seekfree_assistant_h_ #include "zf_common_typedef.h" -#include "zf_common_debug.h" + + +// 1:使能参数调节的功能 0:关闭参数调节的功能 +#define SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE ( 1 ) + + // 定义接收FIFO大小 -#define SEEKFREE_ASSISTANT_BUFFER_SIZE ( 0x80 ) +#define SEEKFREE_ASSISTANT_BUFFER_SIZE ( 0x80 ) + +// 定义示波器的最大通道数量 +#define SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT ( 0x08 ) + +// 定义参数调试的最大通道数量 +#define SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT ( 0x08 ) + +// 定义图像边线最大数量 +#define SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY ( 0x08 ) + +// 单片机往上位机发送的帧头 +#define SEEKFREE_ASSISTANT_SEND_HEAD ( 0xAA ) + +// 摄像头类 +#define SEEKFREE_ASSISTANT_CAMERA_FUNCTION ( 0x02 ) +#define SEEKFREE_ASSISTANT_CAMERA_DOT_FUNCTION ( 0x03 ) +#define SEEKFREE_ASSISTANT_CAMERA_OSCILLOSCOPE ( 0x10 ) + +// 上位机往单片机发送的帧头 +#define SEEKFREE_ASSISTANT_RECEIVE_HEAD ( 0x55 ) + +// 参数设置类 +#define SEEKFREE_ASSISTANT_RECEIVE_SET_PARAMETER ( 0x20 ) -// 定义示波器的最大通道数量 -#define SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT ( 0x08 ) - -// 定义参数调试的最大通道数量 -#define SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT ( 0x08 ) - -// 定义图像边线最大数量 -#define SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY ( 0x08 ) - -// 单片机往上位机发送的帧头 -#define SEEKFREE_ASSISTANT_SEND_HEAD ( 0xAA ) - -// 摄像头类 -#define SEEKFREE_ASSISTANT_CAMERA_FUNCTION ( 0x02 ) -#define SEEKFREE_ASSISTANT_CAMERA_DOT_FUNCTION ( 0x03 ) -#define SEEKFREE_ASSISTANT_CAMERA_OSCILLOSCOPE ( 0x10 ) - -// 上位机往单片机发送的帧头 -#define SEEKFREE_ASSISTANT_RECEIVE_HEAD ( 0x55 ) - -// 参数设置类 -#define SEEKFREE_ASSISTANT_RECEIVE_SET_PARAMETER ( 0x20 ) // 摄像头类型枚举 typedef enum @@ -91,71 +97,69 @@ typedef enum typedef struct { - uint8 head; // 帧头 - uint8 channel_num; // 高四位为功能字 低四位为通道数量 - uint8 check_sum; // 和校验 - uint8 length; // 包长度 - float data[SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT]; // 通道数据 + uint8 head; // 帧头 + uint8 channel_num; // 高四位为功能字 低四位为通道数量 + uint8 check_sum; // 和校验 + uint8 length; // 包长度 + float data[SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT]; // 通道数据 }seekfree_assistant_oscilloscope_struct; typedef struct { - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 camera_type; // 低四位表示边界数量 第四位表示是否有图像数据 例如0x13:其中3表示一副图像有三条边界(通常是左边界、中线、右边界)、1表示没有图像数据 - uint8 length; // 包长度(仅包含协议部分) - uint16 image_width; // 图像宽度 - uint16 image_height; // 图像高度 -}seekfree_assistant_camera_struct; - - -typedef struct -{ - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 dot_type; // 点类型 BIT5:1:坐标是16位的 0:坐标是8位的 BIT7-BIT6:0:只有X坐标 1:只有Y坐标 2:X和Y坐标都有 BIT3-BIT0:边界数量 - uint8 length; // 包长度(仅包含协议部分) - uint16 dot_num; // 画点数量 - uint8 valid_flag; // 通道标识 - uint8 reserve; // 保留 -}seekfree_assistant_camera_dot_struct; - -typedef struct -{ - void *image_addr; // 摄像头地址 - uint16 width; // 图像宽度 - uint16 height; // 图像高度 - seekfree_assistant_image_type_enum camera_type; // 摄像头类型 - void *boundary_x[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界横坐标数组地址 - void *boundary_y[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界纵坐标数组地址 + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 camera_type; // 低四位表示边界数量 第四位表示是否有图像数据 例如0x13:其中3表示一副图像有三条边界(通常是左边界、中线、右边界)、1表示没有图像数据 + uint8 length; // 包长度(仅包含协议部分) + uint16 image_width; // 图像宽度 + uint16 image_height; // 图像高度 +}seekfree_assistant_camera_struct; + + +typedef struct +{ + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 dot_type; // 点类型 BIT5:1:坐标是16位的 0:坐标是8位的 BIT7-BIT6:0:只有X坐标 1:只有Y坐标 2:X和Y坐标都有 BIT3-BIT0:边界数量 + uint8 length; // 包长度(仅包含协议部分) + uint16 dot_num; // 画点数量 + uint8 valid_flag; // 通道标识 + uint8 reserve; // 保留 +}seekfree_assistant_camera_dot_struct; + +typedef struct +{ + void *image_addr; // 摄像头地址 + uint16 width; // 图像宽度 + uint16 height; // 图像高度 + seekfree_assistant_image_type_enum camera_type; // 摄像头类型 + void *boundary_x[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界横坐标数组地址 + void *boundary_y[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界纵坐标数组地址 }seekfree_assistant_camera_buffer_struct; typedef struct { - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 channel; // 通道 - uint8 check_sum; // 和校验 - float data; // 数据 + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 channel; // 通道 + uint8 check_sum; // 和校验 + float data; // 数据 }seekfree_assistant_parameter_struct; +typedef uint32 (*seekfree_assistant_transfer_callback_function) (const uint8 *buff, uint32 length); +typedef uint32 (*seekfree_assistant_receive_callback_function) (uint8 *buff, uint32 length); -extern seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 -extern float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 保存接收到的参数 -extern vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 参数更新标志位 +extern seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 +extern float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 保存接收到的参数 +extern vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 参数更新标志位 + + +void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struct *seekfree_assistant_oscilloscope); +void seekfree_assistant_camera_information_config (seekfree_assistant_image_type_enum camera_type, void *image_addr, uint16 width, uint16 height); +void seekfree_assistant_camera_boundary_config (seekfree_assistant_boundary_type_enum boundary_type, uint16 dot_num, void *dot_x1, void *dot_x2, void *dot_x3, void *dot_y1, void *dot_y2, void *dot_y3); +void seekfree_assistant_camera_send (void); +void seekfree_assistant_data_analysis (void); -uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length); -uint32 seekfree_assistant_receive (uint8 *buff, uint32 length); - -void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struct *seekfree_assistant_oscilloscope); - -void seekfree_assistant_camera_information_config (seekfree_assistant_image_type_enum camera_type, void *image_addr, uint16 width, uint16 height); -void seekfree_assistant_camera_boundary_config (seekfree_assistant_boundary_type_enum boundary_type, uint16 dot_num, void *dot_x1, void *dot_x2, void *dot_x3, void *dot_y1, void *dot_y2, void *dot_y3); -void seekfree_assistant_camera_send (void); - -void seekfree_assistant_data_analysis (void); -void seekfree_assistant_init (void); #endif diff --git a/Example/E01_gpio_demo/libraries/zf_components/seekfree_assistant_interface.c b/Example/E01_gpio_demo/libraries/zf_components/seekfree_assistant_interface.c index 99dbeef..fdade63 100644 --- a/Example/E01_gpio_demo/libraries/zf_components/seekfree_assistant_interface.c +++ b/Example/E01_gpio_demo/libraries/zf_components/seekfree_assistant_interface.c @@ -1,42 +1,55 @@ /********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant_interface * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ #include "zf_common_typedef.h" +#include "zf_common_fifo.h" #include "zf_common_debug.h" +#include "zf_driver_uart.h" +#include "zf_device_wireless_uart.h" +#include "zf_device_bluetooth_ch9141.h" +#include "zf_device_wifi_uart.h" +#include "zf_device_wifi_spi.h" #include "seekfree_assistant.h" +#include "seekfree_assistant_interface.h" + + +extern seekfree_assistant_transfer_callback_function seekfree_assistant_transfer_callback; // 数据发送函数指针 +extern seekfree_assistant_receive_callback_function seekfree_assistant_receive_callback; // 数据接收函数指针 + + //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手发送函数 // 参数说明 *buff 需要发送的数据地址 @@ -46,11 +59,9 @@ //------------------------------------------------------------------------------------------------------------------- ZF_WEAK uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length) { - uint32 len = 0; - - len = debug_send_buffer(buff, length); - - return len; + + // 当选择自定义通讯方式时 需要自行完成数据发送功能 + return length; } //------------------------------------------------------------------------------------------------------------------- @@ -62,11 +73,57 @@ ZF_WEAK uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length) //------------------------------------------------------------------------------------------------------------------- ZF_WEAK uint32 seekfree_assistant_receive (uint8 *buff, uint32 length) { - uint32 len = 0; + // 当选择自定义通讯方式时 需要自行完成数据接收功能 + return 0; +} - len = debug_read_ring_buffer(buff, length); - - return len; +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 逐飞助手接口 初始化 +// 参数说明 +// 返回参数 void +// 使用示例 seekfree_assistant_interface_init(SEEKFREE_ASSISTANT_WIFI_SPI); 使用高速WIFI SPI模块进行数据收发 +// 备注 需要自行调用设备的初始化,例如使用无线转串口进行数据的收发,则需要自行调用无线转串口的初始化,然后再调用seekfree_assistant_interface_init完成逐飞助手的接口初始化 +//------------------------------------------------------------------------------------------------------------------- +ZF_WEAK void seekfree_assistant_interface_init (seekfree_assistant_transfer_device_enum transfer_device) +{ + switch(transfer_device) + { + case SEEKFREE_ASSISTANT_DEBUG_UART: + { + seekfree_assistant_transfer_callback = debug_send_buffer; + seekfree_assistant_receive_callback = debug_read_ring_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIRELESS_UART: + { + seekfree_assistant_transfer_callback = wireless_uart_send_buffer; + seekfree_assistant_receive_callback = wireless_uart_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_CH9141: + { + seekfree_assistant_transfer_callback = bluetooth_ch9141_send_buffer; + seekfree_assistant_receive_callback = bluetooth_ch9141_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIFI_UART: + { + seekfree_assistant_transfer_callback = wifi_uart_send_buffer; + seekfree_assistant_receive_callback = wifi_uart_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIFI_SPI: + { + seekfree_assistant_transfer_callback = wifi_spi_send_buffer; + seekfree_assistant_receive_callback = wifi_spi_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_CUSTOM: + { + // 根据自己的需求 自行实现seekfree_assistant_transfer与seekfree_assistant_receive函数,完成数据的收发 + + }break; + } } diff --git a/Example/E01_gpio_demo/libraries/zf_components/seekfree_assistant_interface.h b/Example/E01_gpio_demo/libraries/zf_components/seekfree_assistant_interface.h new file mode 100644 index 0000000..940b5f7 --- /dev/null +++ b/Example/E01_gpio_demo/libraries/zf_components/seekfree_assistant_interface.h @@ -0,0 +1,57 @@ +/********************************************************************************************************************* +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 +* Copyright (c) 2022 SEEKFREE 逐飞科技 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 +* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 +* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 +* +* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 +* 甚至没有隐含的适销性或适合特定用途的保证 +* 更多细节请参见 GPL +* +* 您应该在收到本开源库的同时收到一份 GPL 的副本 +* 如果没有,请参阅 +* +* 额外注明: +* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 +* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 +* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 +* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) +* +* 文件名称 seekfree_assistant_interface +* 公司名称 成都逐飞科技有限公司 +* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A +* 店铺链接 https://seekfree.taobao.com/ +* +* 修改记录 +* 日期 作者 备注 +* 2024-1-11 SeekFree first version +********************************************************************************************************************/ + +#ifndef _seekfree_assistant_interface_h_ +#define _seekfree_assistant_interface_h_ + + + +// 数据发送设备枚举 +typedef enum +{ + SEEKFREE_ASSISTANT_DEBUG_UART, // 调试串口 使用的串口由DEBUG_UART_INDEX宏定义指定 + SEEKFREE_ASSISTANT_WIRELESS_UART, // 无线转串口 + SEEKFREE_ASSISTANT_CH9141, // CH9141蓝牙 + SEEKFREE_ASSISTANT_WIFI_UART, // WIFI转串口 + SEEKFREE_ASSISTANT_WIFI_SPI, // 高速WIFI SPI + SEEKFREE_ASSISTANT_CUSTOM, // 自定义通讯方式 需要自行seekfree_assistant_transfer与seekfree_assistant_receive函数 +}seekfree_assistant_transfer_device_enum; + + +void seekfree_assistant_interface_init (seekfree_assistant_transfer_device_enum transfer_device); + + + +#endif diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_absolute_encoder.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_absolute_encoder.c index 7c80a3b..f9bc809 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_absolute_encoder.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_absolute_encoder.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_absolute_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_absolute_encoder.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_absolute_encoder.h index e6cc057..ed92906 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_absolute_encoder.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_absolute_encoder.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_absolute_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c index 500bccb..b0a06df 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_bluetooth_ch9141 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -54,7 +54,7 @@ #include "zf_device_camera.h" #include "zf_device_bluetooth_ch9141.h" -static fifo_obj_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 +static fifo_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 static uint8 bluetooth_ch9141_buffer[BLUETOOTH_CH9141_BUFFER_SIZE]; // 数据存放数组 static uint8 bluetooth_ch9141_data = 0; // 数据临时存放变量 diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h index 800be6c..ffb30b5 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h @@ -24,7 +24,7 @@ * 文件名称 main * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_camera.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_camera.c index 84c7aa0..68668c4 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_camera.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_camera.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_camera * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -45,7 +45,7 @@ #include "zf_device_camera.h" -fifo_obj_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 +fifo_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; // 定义摄像头接收数据缓冲区 uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // 定义摄像头数据发送到上位机的帧头 diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_camera.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_camera.h index 58efb06..2cd7d2d 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_camera.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_camera.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_camera * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -44,7 +44,7 @@ //=================================================摄像头公共库 基本配置================================================ #define CAMERA_RECEIVER_BUFFER_SIZE (8) // 定义摄像头接收数据缓冲区大小 -extern fifo_obj_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 +extern fifo_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 extern uint8 camera_send_image_frame_header[4]; // 声明摄像头数据发送到上位机的帧头 //=================================================摄像头公共库 基本配置================================================ diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_config.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_config.h index af6a3d8..6c8147d 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_config.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_config.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_config * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_dl1a.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_dl1a.c index 3e7410c..27be3a7 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_dl1a.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_dl1a.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1a * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_dl1a.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_dl1a.h index 89145d3..3176dd3 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_dl1a.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_dl1a.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1a * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_dl1b.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_dl1b.c index 90e64b3..96e472e 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_dl1b.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_dl1b.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1b * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_dl1b.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_dl1b.h index b144739..922b3ce 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_dl1b.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_dl1b.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1b * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_gps_tau1201.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_gnss.c similarity index 60% rename from Example/E01_gpio_demo/libraries/zf_device/zf_device_gps_tau1201.c rename to Example/E01_gpio_demo/libraries/zf_device/zf_device_gnss.c index da46a99..caf7cd0 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_gps_tau1201.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_gnss.c @@ -21,27 +21,26 @@ * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) * -* 文件名称 zf_device_gps_tau1201 +* 文件名称 zf_device_gnss * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * * 修改记录 -* 日期 作者 备注 -* 2022-09-15 pudding first version -* 2023-04-28 pudding 增加中文注释说明 +* 日期 作者 备注 +* 2023-12-28 pudding first version ********************************************************************************************************************/ -/******************************************************************************************************************** +/********************************************************************************************************************* * 接线定义: -* ------------------------------------ -* 模块管脚 单片机管脚 -* RX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_RX 宏定义 -* TX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_TX 宏定义 -* VCC 3.3V电源 -* GND 电源地 -* ------------------------------------ +* ------------------------------------ +* 模块管脚 单片机管脚 +* RX 查看 zf_device_gnss.h 中 GNSS_RX 宏定义 +* TX 查看 zf_device_gnss.h 中 GNSS_TX 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* ------------------------------------ ********************************************************************************************************************/ #include "math.h" @@ -50,22 +49,24 @@ #include "zf_driver_delay.h" #include "zf_driver_uart.h" -#include "zf_device_gps_tau1201.h" +#include "zf_device_gnss.h" -#define GPS_TAU1201_BUFFER_SIZE ( 128 ) +#define GNSS_BUFFER_SIZE ( 128 ) -uint8 gps_tau1201_flag = 0; // 1:采集完成等待处理数据 0:没有采集完成 -gps_info_struct gps_tau1201; // GPS解析之后的数据 +uint8 gnss_flag = 0; // 1:采集完成等待处理数据 0:没有采集完成 +gnss_info_struct gnss; // GPS解析之后的数据 + +static uint8 gnss_state = 0; // 1:GPS初始化完成 +static fifo_struct gnss_receiver_fifo; // +static uint8 gnss_receiver_buffer[GNSS_BUFFER_SIZE]; // 数据存放数组 -static uint8 gps_tau1201_state = 0; // 1:GPS初始化完成 -static fifo_obj_struct gps_tau1201_receiver_fifo; // -static uint8 gps_tau1201_receiver_buffer[GPS_TAU1201_BUFFER_SIZE]; // 数据存放数组 +static gps_state_enum gnss_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 +static gps_state_enum gnss_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 +static gps_state_enum gnss_ths_state = GPS_STATE_RECEIVING; // rmc 语句状态 -gps_state_enum gps_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 -gps_state_enum gps_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 - -static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; // GGA语句缓冲区 -static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; // RMC语句缓冲区 +static uint8 gps_gga_buffer[GNSS_BUFFER_SIZE]; +static uint8 gps_rmc_buffer[GNSS_BUFFER_SIZE]; +static uint8 gps_ths_buffer[GNSS_BUFFER_SIZE]; //------------------------------------------------------------------------------------------------------------------- // 函数简介 获取指定 ',' 后面的索引 @@ -94,7 +95,7 @@ static uint8 get_parameter_index (uint8 num, char *str) } if(j == num) { - len1 = i + 1; + len1 = i + 1; break; } } @@ -121,7 +122,7 @@ static int get_int_number (char *s) return_value = func_str_to_int(buf); return return_value; } - + //------------------------------------------------------------------------------------------------------------------- // 函数简介 给定字符串第一个 ',' 之前的数据转换为float // 参数说明 *s 字符串 @@ -134,15 +135,15 @@ static float get_float_number (char *s) uint8 i = 0; char buf[15]; float return_value = 0; - + i = get_parameter_index(1, s); i = i - 1; strncpy(buf, s, i); buf[i] = 0; return_value = (float)func_str_to_double(buf); - return return_value; + return return_value; } - + //------------------------------------------------------------------------------------------------------------------- // 函数简介 给定字符串第一个 ',' 之前的数据转换为double // 参数说明 *s 字符串 @@ -155,7 +156,7 @@ static double get_double_number (char *s) uint8 i = 0; char buf[15]; double return_value = 0; - + i = get_parameter_index(1, s); i = i - 1; strncpy(buf, s, i); @@ -168,13 +169,13 @@ static double get_double_number (char *s) // 函数简介 世界时间转换为北京时间 // 参数说明 *time 保存的时间 // 返回参数 void -// 使用示例 utc_to_btc(&gps->time); +// 使用示例 utc_to_btc(&gnss->time); // 备注信息 内部使用 //------------------------------------------------------------------------------------------------------------------- static void utc_to_btc (gps_time_struct *time) { uint8 day_num = 0; - + time->hour = time->hour + 8; if(23 < time->hour) { @@ -197,7 +198,7 @@ static void utc_to_btc (gps_time_struct *time) day_num = 30; } } - + if(time->day > day_num) { time->day = 1; @@ -214,18 +215,18 @@ static void utc_to_btc (gps_time_struct *time) //------------------------------------------------------------------------------------------------------------------- // 函数简介 RMC语句解析 // 参数说明 *line 接收到的语句信息 -// 参数说明 *gps 保存解析后的数据 +// 参数说明 *gnss 保存解析后的数据 // 返回参数 uint8 1:解析成功 0:数据有问题不能解析 -// 使用示例 gps_gnrmc_parse((char *)data_buffer, &gps_tau1201); +// 使用示例 gps_gnrmc_parse((char *)data_buffer, &gnss); // 备注信息 内部使用 //------------------------------------------------------------------------------------------------------------------- -static uint8 gps_gnrmc_parse (char *line, gps_info_struct *gps) +static uint8 gps_gnrmc_parse (char *line, gnss_info_struct *gnss) { uint8 state = 0, temp = 0; - + double latitude = 0; // 纬度 double longitude = 0; // 经度 - + double lati_cent_tmp = 0, lati_second_tmp = 0; double long_cent_tmp = 0, long_second_tmp = 0; float speed_tmp = 0; @@ -234,47 +235,50 @@ static uint8 gps_gnrmc_parse (char *line, gps_info_struct *gps) state = buf[get_parameter_index(2, buf)]; - gps->state = 0; if('A' == state) // 如果数据有效 则解析数据 { return_state = 1; - gps->state = 1; - gps -> ns = buf[get_parameter_index(4, buf)]; - gps -> ew = buf[get_parameter_index(6, buf)]; + gnss->state = 1; + gnss -> ns = buf[get_parameter_index(4, buf)]; + gnss -> 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; // 纬度转换为度分秒 - lati_cent_tmp = (latitude - gps->latitude_degree * 100); - gps->latitude_cent = (int)lati_cent_tmp; - lati_second_tmp = (lati_cent_tmp - gps->latitude_cent) * 6000; - gps->latitude_second = (int)lati_second_tmp; + gnss->latitude_degree = (int)latitude / 100; // 纬度转换为度分秒 + lati_cent_tmp = (latitude - gnss->latitude_degree * 100); + gnss->latitude_cent = (int)lati_cent_tmp; + lati_second_tmp = (lati_cent_tmp - gnss->latitude_cent) * 6000; + gnss->latitude_second = (int)lati_second_tmp; - gps->longitude_degree = (int)longitude / 100; // 经度转换为度分秒 - long_cent_tmp = (longitude - gps->longitude_degree * 100); - gps->longitude_cent = (int)long_cent_tmp; - long_second_tmp = (long_cent_tmp - gps->longitude_cent) * 6000; - gps->longitude_second = (int)long_second_tmp; + gnss->longitude_degree = (int)longitude / 100; // 经度转换为度分秒 + long_cent_tmp = (longitude - gnss->longitude_degree * 100); + gnss->longitude_cent = (int)long_cent_tmp; + long_second_tmp = (long_cent_tmp - gnss->longitude_cent) * 6000; + gnss->longitude_second = (int)long_second_tmp; - gps->latitude = gps->latitude_degree + lati_cent_tmp / 60; - gps->longitude = gps->longitude_degree + long_cent_tmp / 60; + gnss->latitude = gnss->latitude_degree + lati_cent_tmp / 60; + gnss->longitude = gnss->longitude_degree + long_cent_tmp / 60; speed_tmp = get_float_number(&buf[get_parameter_index(7, buf)]); // 速度(海里/小时) - gps->speed = speed_tmp * 1.85f; // 转换为公里/小时 - gps->direction = get_float_number(&buf[get_parameter_index(8, buf)]); // 角度 + gnss->speed = speed_tmp * 1.85f; // 转换为公里/小时 + gnss->direction = get_float_number(&buf[get_parameter_index(8, buf)]); // 角度 + } + else + { + gnss->state = 0; } // 在定位没有生效前也是有时间数据的,可以直接解析 - gps->time.hour = (buf[7] - '0') * 10 + (buf[8] - '0'); // 时间 - gps->time.minute = (buf[9] - '0') * 10 + (buf[10] - '0'); - gps->time.second = (buf[11] - '0') * 10 + (buf[12] - '0'); + gnss->time.hour = (buf[7] - '0') * 10 + (buf[8] - '0'); // 时间 + gnss->time.minute = (buf[9] - '0') * 10 + (buf[10] - '0'); + gnss->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'); // 日期 - 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; + gnss->time.day = (buf[temp + 0] - '0') * 10 + (buf[temp + 1] - '0'); // 日期 + gnss->time.month = (buf[temp + 2] - '0') * 10 + (buf[temp + 3] - '0'); + gnss->time.year = (buf[temp + 4] - '0') * 10 + (buf[temp + 5] - '0') + 2000; - utc_to_btc(&gps->time); + utc_to_btc(&gnss->time); return return_state; } @@ -282,12 +286,12 @@ static uint8 gps_gnrmc_parse (char *line, gps_info_struct *gps) //------------------------------------------------------------------------------------------------------------------- // 函数简介 GGA语句解析 // 参数说明 *line 接收到的语句信息 -// 参数说明 *gps 保存解析后的数据 +// 参数说明 *gnss 保存解析后的数据 // 返回参数 uint8 1:解析成功 0:数据有问题不能解析 -// 使用示例 gps_gngga_parse((char *)data_buffer, &gps_tau1201); +// 使用示例 gps_gngga_parse((char *)data_buffer, &gnss); // 备注信息 内部使用 //------------------------------------------------------------------------------------------------------------------- -static uint8 gps_gngga_parse (char *line, gps_info_struct *gps) +static uint8 gps_gngga_parse (char *line, gnss_info_struct *gnss) { uint8 state = 0; char *buf = line; @@ -297,11 +301,41 @@ static uint8 gps_gngga_parse (char *line, gps_info_struct *gps) 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)]); // 高度 = 海拔高度 + 地球椭球面相对大地水准面的高度 + gnss->satellite_used = (uint8)get_int_number(&buf[get_parameter_index(7, buf)]); + gnss->height = get_float_number(&buf[get_parameter_index(9, buf)]) + get_float_number(&buf[get_parameter_index(11, buf)]); // 高度 = 海拔高度 + 地球椭球面相对大地水准面的高度 return_state = 1; } + + return return_state; +} +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 THS语句解析 +// 参数说明 *line 接收到的语句信息 +// 参数说明 *gnss 保存解析后的数据 +// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 +// 使用示例 gps_gnths_parse((char *)data_buffer, &gnss); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 gps_gnths_parse (char *line, gnss_info_struct *gnss) +{ + uint8 state = 0; + char *buf = line; + uint8 return_state = 0; + + state = buf[get_parameter_index(2, buf)]; + + if('A' == state) + { + gnss->antenna_direction_state = 1; + gnss->antenna_direction = get_float_number(&buf[get_parameter_index(1, buf)]); + return_state = 1; + } + else + { + gnss->antenna_direction_state = 0; + } + return return_state; } @@ -316,7 +350,7 @@ static uint8 gps_gngga_parse (char *line, gps_info_struct *gps) // 备注信息 //------------------------------------------------------------------------------------------------------------------- double get_two_points_distance (double latitude1, double longitude1, double latitude2, double longitude2) -{ +{ const double EARTH_RADIUS = 6378137; // 地球半径(单位:m) double rad_latitude1 = 0; double rad_latitude2 = 0; @@ -325,7 +359,7 @@ double get_two_points_distance (double latitude1, double longitude1, double lati double distance = 0; double a = 0; double b = 0; - + rad_latitude1 = ANGLE_TO_RAD(latitude1); // 根据角度计算弧度 rad_latitude2 = ANGLE_TO_RAD(latitude2); rad_longitude1 = ANGLE_TO_RAD(longitude1); @@ -335,9 +369,9 @@ double get_two_points_distance (double latitude1, double longitude1, double lati 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 里面实现的算法 - distance = distance * EARTH_RADIUS; + distance = distance * EARTH_RADIUS; - return distance; + return distance; } //------------------------------------------------------------------------------------------------------------------- @@ -370,7 +404,7 @@ double get_two_points_azimuth (double latitude1, double longitude1, double latit // 使用示例 gps_data_parse(); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint8 gps_data_parse (void) +uint8 gnss_data_parse (void) { uint8 return_state = 0; uint8 check_buffer[5] = {'0', 'x', 0x00, 0x00, 0x00}; @@ -380,9 +414,9 @@ uint8 gps_data_parse (void) do { - if(GPS_STATE_RECEIVED == gps_rmc_state) + if(GPS_STATE_RECEIVED == gnss_rmc_state) { - gps_rmc_state = GPS_STATE_PARSING; + gnss_rmc_state = GPS_STATE_PARSING; strncpy((char *)&check_buffer[2], strchr((const char *)gps_rmc_buffer, '*') + 1, 2); bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); for(bbc_xor_calculation = gps_rmc_buffer[1], data_len = 2; '*' != gps_rmc_buffer[data_len]; data_len ++) @@ -395,17 +429,17 @@ uint8 gps_data_parse (void) return_state = 1; break; } - - gps_gnrmc_parse((char *)gps_rmc_buffer, &gps_tau1201); + + gps_gnrmc_parse((char *)gps_rmc_buffer, &gnss); } - gps_rmc_state = GPS_STATE_RECEIVING; - - if(GPS_STATE_RECEIVED == gps_gga_state) + gnss_rmc_state = GPS_STATE_RECEIVING; + + if(GPS_STATE_RECEIVED == gnss_gga_state) { - gps_gga_state = GPS_STATE_PARSING; + gnss_gga_state = GPS_STATE_PARSING; strncpy((char *)&check_buffer[2], strchr((const char *)gps_gga_buffer, '*') + 1, 2); bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); - + for(bbc_xor_calculation = gps_gga_buffer[1], data_len = 2; '*' != gps_gga_buffer[data_len]; data_len ++) { bbc_xor_calculation ^= gps_gga_buffer[data_len]; @@ -416,11 +450,32 @@ uint8 gps_data_parse (void) return_state = 1; break; } - - gps_gngga_parse((char *)gps_gga_buffer, &gps_tau1201); + + gps_gngga_parse((char *)gps_gga_buffer, &gnss); } - gps_gga_state = GPS_STATE_RECEIVING; - + gnss_gga_state = GPS_STATE_RECEIVING; + + if(GPS_STATE_RECEIVED == gnss_ths_state) + { + gnss_ths_state = GPS_STATE_PARSING; + strncpy((char *)&check_buffer[2], strchr((const char *)gps_ths_buffer, '*') + 1, 2); + bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); + + for(bbc_xor_calculation = gps_ths_buffer[1], data_len = 2; '*' != gps_ths_buffer[data_len]; data_len ++) + { + bbc_xor_calculation ^= gps_ths_buffer[data_len]; + } + if(bbc_xor_calculation != bbc_xor_origin) + { + // 数据校验失败 + return_state = 1; + break; + } + + gps_gnths_parse((char *)gps_ths_buffer, &gnss); + } + gnss_ths_state = GPS_STATE_RECEIVING; + }while(0); return return_state; } @@ -433,51 +488,64 @@ uint8 gps_data_parse (void) // 使用示例 gps_uart_callback(); // 备注信息 此函数需要在串口接收中断内进行调用 //------------------------------------------------------------------------------------------------------------------- -void gps_uart_callback (void) +void gnss_uart_callback (void) { uint8 temp_gps[6]; uint32 temp_length = 0; - if(gps_tau1201_state) + + + + if(gnss_state) { uint8 dat; - while(uart_query_byte(GPS_TAU1201_UART, &dat)) + while(uart_query_byte(GNSS_UART, &dat)) { - fifo_write_buffer(&gps_tau1201_receiver_fifo, &dat, 1); + fifo_write_buffer(&gnss_receiver_fifo, &dat, 1); } - + if('\n' == dat) { // 读取前6个数据 用于判断语句类型 temp_length = 6; - fifo_read_buffer(&gps_tau1201_receiver_fifo, temp_gps, &temp_length, FIFO_READ_ONLY); - + fifo_read_buffer(&gnss_receiver_fifo, temp_gps, &temp_length, FIFO_READ_ONLY); + // 根据不同类型将数据拷贝到不同的缓冲区 if(0 == strncmp((char *)&temp_gps[3], "RMC", 3)) { // 如果没有在解析数据则更新缓冲区的数据 - if(GPS_STATE_PARSING != gps_rmc_state) + if(GPS_STATE_PARSING != gnss_rmc_state) { - gps_rmc_state = GPS_STATE_RECEIVED; - temp_length = fifo_used(&gps_tau1201_receiver_fifo); - fifo_read_buffer(&gps_tau1201_receiver_fifo, gps_rmc_buffer, &temp_length, FIFO_READ_AND_CLEAN); + gnss_rmc_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_rmc_buffer, &temp_length, FIFO_READ_AND_CLEAN); } } else if(0 == strncmp((char *)&temp_gps[3], "GGA", 3)) { // 如果没有在解析数据则更新缓冲区的数据 - if(GPS_STATE_PARSING != gps_gga_state) + if(GPS_STATE_PARSING != gnss_gga_state) { - gps_gga_state = GPS_STATE_RECEIVED; - temp_length = fifo_used(&gps_tau1201_receiver_fifo); - fifo_read_buffer(&gps_tau1201_receiver_fifo, gps_gga_buffer, &temp_length, FIFO_READ_AND_CLEAN); + gnss_gga_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_gga_buffer, &temp_length, FIFO_READ_AND_CLEAN); } } - + else if(0 == strncmp((char *)&temp_gps[3], "THS", 3)) + { + // 如果没有在解析数据则更新缓冲区的数据 + if(GPS_STATE_PARSING != gnss_ths_state) + { + gnss_ths_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_ths_buffer, &temp_length, FIFO_READ_AND_CLEAN); + } + } + // 统一将FIFO清空 - fifo_clear(&gps_tau1201_receiver_fifo); + fifo_clear(&gnss_receiver_fifo); - gps_tau1201_flag = 1; + gnss_flag = 1; } } } @@ -489,12 +557,12 @@ void gps_uart_callback (void) // 使用示例 gps_init(); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -void gps_init (void) +void gnss_init (gps_device_enum gps_device) { 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}; @@ -504,38 +572,49 @@ void gps_init (void) 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}; + + if((TAU1201 == gps_device) || (GN42A == gps_device)) + { + fifo_init(&gnss_receiver_fifo, FIFO_DATA_8BIT, gnss_receiver_buffer, GNSS_BUFFER_SIZE); + system_delay_ms(500); // 等待GPS启动后开始初始化 + uart_init(GNSS_UART, 115200, GNSS_RX, GNSS_TX); - fifo_init(&gps_tau1201_receiver_fifo, FIFO_DATA_8BIT, gps_tau1201_receiver_buffer, GPS_TAU1201_BUFFER_SIZE); - system_delay_ms(500); // 等待GPS启动后开始初始化 - uart_init(GPS_TAU1201_UART, 115200, GPS_TAU1201_RX, GPS_TAU1201_TX); - uart_rx_interrupt(GPS_TAU1201_UART, 0); + uart_write_buffer(GNSS_UART, (uint8 *)set_rate, sizeof(set_rate)); // 设置GPS更新速率为10hz 如果不调用此语句则默认为1hz + system_delay_ms(200); + + uart_write_buffer(GNSS_UART, (uint8 *)open_rmc, sizeof(open_rmc)); // 开启rmc语句 + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)open_gga, sizeof(open_gga)); // 开启gga语句 + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gll, sizeof(close_gll)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gsa, sizeof(close_gsa)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_grs, sizeof(close_grs)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gsv, sizeof(close_gsv)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_vtg, sizeof(close_vtg)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_zda, sizeof(close_zda)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gst, sizeof(close_gst)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_txt, sizeof(close_txt)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_txt_ant, sizeof(close_txt_ant)); + system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)set_rate, sizeof(set_rate)); // 设置GPS更新速率为10hz 如果不调用此语句则默认为1hz - system_delay_ms(200); - - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)open_rmc, sizeof(open_rmc)); // 开启rmc语句 - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)open_gga, sizeof(open_gga)); // 开启gga语句 - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gll, sizeof(close_gll)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gsa, sizeof(close_gsa)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_grs, sizeof(close_grs)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gsv, sizeof(close_gsv)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_vtg, sizeof(close_vtg)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_zda, sizeof(close_zda)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gst, sizeof(close_gst)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_txt, sizeof(close_txt)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_txt_ant, sizeof(close_txt_ant)); - system_delay_ms(50); - - gps_tau1201_state = 1; - uart_rx_interrupt(GPS_TAU1201_UART, 1); + gnss_state = 1; + uart_rx_interrupt(GNSS_UART, 1); + } + else if(GN43RFA == gps_device) + { + // GN43RFA RTK模块不需要进行参数设置,如果需要修改参数应该使用专用的上位机修改参数 + fifo_init(&gnss_receiver_fifo, FIFO_DATA_8BIT, gnss_receiver_buffer, GNSS_BUFFER_SIZE); + uart_init(GNSS_UART, 115200, GNSS_RX, GNSS_TX); + gnss_state = 1; + uart_rx_interrupt(GNSS_UART, 1); + } + } diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_gnss.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_gnss.h new file mode 100644 index 0000000..5d58976 --- /dev/null +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_gnss.h @@ -0,0 +1,125 @@ +/********************************************************************************************************************* +* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* Copyright (c) 2022 SEEKFREE 逐飞科技 +* +* 本文件是 TC264 开源库的一部分 +* +* TC264 开源库 是免费软件 +* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 +* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 +* +* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 +* 甚至没有隐含的适销性或适合特定用途的保证 +* 更多细节请参见 GPL +* +* 您应该在收到本开源库的同时收到一份 GPL 的副本 +* 如果没有,请参阅 +* +* 额外注明: +* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 +* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 +* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 +* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) +* +* 文件名称 zf_device_gnss +* 公司名称 成都逐飞科技有限公司 +* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 +* 开发环境 ADS v1.9.20 +* 适用平台 TC264D +* 店铺链接 https://seekfree.taobao.com/ +* +* 修改记录 +* 日期 作者 备注 +* 2023-12-28 pudding first version +********************************************************************************************************************/ +/********************************************************************************************************************* +* 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* RX 查看 zf_device_gnss.h 中 GNSS_RX 宏定义 +* TX 查看 zf_device_gnss.h 中 GNSS_TX 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* ------------------------------------ +********************************************************************************************************************/ + +#ifndef _zf_device_gnss_h_ +#define _zf_device_gnss_h_ + +#include "zf_common_typedef.h" + +//-------------------------------------------------------------------------------------------------- +//引脚配置 +//-------------------------------------------------------------------------------------------------- +#define GNSS_UART (UART_3) +#define GNSS_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 +#define GNSS_TX (UART3_RX_P15_7) // GPS TX串口引脚 + +#define ANGLE_TO_RAD(x) ( (x) * PI / 180.0 ) // 角度转换为弧度 +#define RAD_TO_ANGLE(x) ( (x) * 180.0 / PI ) // 弧度转换为角度 +#define PI ( 3.1415926535898 ) + +typedef enum +{ + TAU1201 = 1, // 逐飞科技双频GPS模块 + GN42A = 1, // 逐飞科技双频GPS模块 与TAU1201是一样的 + GN43RFA = 2, // 逐飞科技三频RTK模块 +}gps_device_enum; + +typedef struct +{ + uint16 year; + uint8 month; + uint8 day; + uint8 hour; + uint8 minute; + uint8 second; +}gps_time_struct; + +typedef struct +{ + gps_time_struct time; // 时间 + + uint8 state; // 有效状态 1:定位有效 0:定位无效 + + uint16 latitude_degree; // 度 + uint16 latitude_cent; // 分 + uint16 latitude_second; // 秒 这里的秒是被放大了100倍的,主要是避免使用浮点数 + uint16 longitude_degree; // 度 + uint16 longitude_cent; // 分 + uint16 longitude_second; // 秒 这里的秒是被放大了100倍的,主要是避免使用浮点数 + + double latitude; // 纬度 + double longitude; // 经度 + + int8 ns; // 纬度半球 N(北半球)或 S(南半球) + int8 ew; // 经度半球 E(东经)或 W(西经) + + float speed; // 速度(公里/每小时) + float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准)+ + uint8 antenna_direction_state; // 双天线测向有效状态 1:测向有效 0:测向无效,无效时antenna_direction数据是无效的 + float antenna_direction; // 主天线指向从天线与真北构成的夹角(000.0~359.9 度) + + // 下面两个个信息从GNGGA语句中获取 + uint8 satellite_used; // 用于定位的卫星数量 + float height; // 高度 +}gnss_info_struct; + +typedef enum +{ + GPS_STATE_RECEIVING, // 正在接收数据 + GPS_STATE_RECEIVED, // 数据接收完成 + GPS_STATE_PARSING, // 正在解析 +}gps_state_enum; + +extern gnss_info_struct gnss; +extern uint8 gnss_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); +uint8 gnss_data_parse (void); +void gnss_uart_callback (void); +void gnss_init (gps_device_enum gps_device); + +#endif diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_gps_tau1201.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_gps_tau1201.h deleted file mode 100644 index c167bae..0000000 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_gps_tau1201.h +++ /dev/null @@ -1,117 +0,0 @@ -/********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 -* Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 -* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 -* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* -* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 -* 甚至没有隐含的适销性或适合特定用途的保证 -* 更多细节请参见 GPL -* -* 您应该在收到本开源库的同时收到一份 GPL 的副本 -* 如果没有,请参阅 -* -* 额外注明: -* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 -* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 -* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 -* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* -* 文件名称 zf_device_gps_tau1201 -* 公司名称 成都逐飞科技有限公司 -* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D -* 店铺链接 https://seekfree.taobao.com/ -* -* 修改记录 -* 日期 作者 备注 -* 2022-09-15 pudding first version -* 2023-04-28 pudding 增加中文注释说明 -********************************************************************************************************************/ -/******************************************************************************************************************** -* 接线定义: -* ------------------------------------ -* 模块管脚 单片机管脚 -* RX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_RX 宏定义 -* TX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_TX 宏定义 -* VCC 3.3V电源 -* GND 电源地 -* ------------------------------------ -********************************************************************************************************************/ - -#ifndef _zf_device_gps_tau1201_h_ -#define _zf_device_gps_tau1201_h_ - -#include "zf_common_typedef.h" - -//=================================================定义 定位模块 基本配置================================================ -#define GPS_TAU1201_UART (UART_3) -#define GPS_TAU1201_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 -#define GPS_TAU1201_TX (UART3_RX_P15_7) // GPS TX串口引脚 - -#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 -#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 -#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; // 时间- - uint8 state; // 有效状态 1:定位有效 0:定位无效 - uint16 latitude_degree; // 度 - uint16 latitude_cent; // 分 - uint16 latitude_second; // 秒 - uint16 longitude_degree; // 度 - uint16 longitude_cent; // 分 - uint16 longitude_second; // 秒 - double latitude; // 纬度 - double longitude; // 经度 - int8 ns; // 纬度半球 N(北半球)或 S(南半球) - int8 ew; // 经度半球 E(东经)或 W(西经) - float speed; // 速度(公里/每小时) - float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) - // 下面两个个信息从GNGGA语句中获取 - uint8 satellite_used; // 用于定位的卫星数量 - float height; // 高度 -}gps_info_struct; - -typedef enum -{ - GPS_STATE_RECEIVING, // 正在接收数据 - GPS_STATE_RECEIVED, // 数据接收完成 - GPS_STATE_PARSING, // 正在解析 -}gps_state_enum; -//================================================定义 定位模块 参数结构体================================================ - - -//=================================================声明 定位模块 全局变量================================================ -extern gps_info_struct gps_tau1201; // GPS解析之后的数据 -extern uint8 gps_tau1201_flag; // 1:采集完成等待处理数据 0:没有采集完成 -//=================================================声明 定位模块 全局变量================================================ - - -//=================================================声明 定位模块 基础函数================================================ -double get_two_points_distance (double lat1, double lng1, double lat2, double lng2); // 计算从第一个点到第二个点的距离(单位:m) -double get_two_points_azimuth (double lat1, double lon1, double lat2, double lon2); // 计算从第一个点到第二个点的方位角(单位:°) -uint8 gps_data_parse (void); // 解析GPS数据 -void gps_uart_callback (void); // GPS回调函数 -void gps_init (void); // GPS初始化 -//=================================================声明 定位模块 基础函数================================================ -#endif diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_icm20602.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_icm20602.c index f4ae830..ddebf3c 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_icm20602.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_icm20602.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_icm20602 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_icm20602.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_icm20602.h index 67724ad..209972b 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_icm20602.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_icm20602.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_icm20602 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_imu660ra.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_imu660ra.c index 95144f9..02fdb9e 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_imu660ra.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_imu660ra.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu660ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_imu660ra.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_imu660ra.h index a689df1..348e6a1 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_imu660ra.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_imu660ra.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu660ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_imu963ra.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_imu963ra.c index 92ec0f6..595142a 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_imu963ra.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_imu963ra.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu963ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_imu963ra.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_imu963ra.h index 4d0d9f9..c0f981f 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_imu963ra.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_imu963ra.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu963ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_ips114.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_ips114.c index 78c6f3b..b13e338 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_ips114.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_ips114.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips114 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_ips114.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_ips114.h index 81dfc3c..ba932b1 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_ips114.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_ips114.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips114 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_ips200.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_ips200.c index cd8681f..37d9d04 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_ips200.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_ips200.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips200 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_ips200.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_ips200.h index ce59927..045bf27 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_ips200.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_ips200.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips200 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_key.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_key.c index 9e42c8a..8b240cb 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_key.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_key.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_key * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_key.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_key.h index bcab8aa..9c653cf 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_key.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_key.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_key * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_mpu6050.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_mpu6050.c index dc3c5b2..101a5ae 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_mpu6050.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_mpu6050.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_mpu6050 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_mpu6050.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_mpu6050.h index 3510e06..c8a086f 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_mpu6050.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_mpu6050.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_mpu6050 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_mt9v03x.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_mt9v03x.c index 231cfec..d38b8df 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_mt9v03x.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_mt9v03x.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_mt9v03x * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_mt9v03x.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_mt9v03x.h index 7786bc5..9d4650d 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_mt9v03x.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_mt9v03x.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_mt9v03x * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_oled.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_oled.c index 5314209..55aefa7 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_oled.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_oled.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_oled * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_oled.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_oled.h index d52d2fd..aadf048 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_oled.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_oled.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_oled * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_ov7725.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_ov7725.c index 12f6095..bac95fe 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_ov7725.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_ov7725.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ov7725 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_ov7725.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_ov7725.h index f45a4e8..2cb4026 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_ov7725.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_ov7725.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ov7725 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_scc8660.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_scc8660.c index 3483c93..38d65ff 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_scc8660.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_scc8660.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_scc8660 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_scc8660.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_scc8660.h index 815d272..537283a 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_scc8660.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_scc8660.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_scc8660 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_tft180.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_tft180.c index db50824..b661e91 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_tft180.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_tft180.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_tft180 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_tft180.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_tft180.h index 47491ee..54a72b3 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_tft180.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_tft180.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_tft180 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_tsl1401.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_tsl1401.c index 3f9db7f..d133c7c 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_tsl1401.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_tsl1401.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_tsl1401 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_tsl1401.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_tsl1401.h index 1fab12e..a7b061c 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_tsl1401.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_tsl1401.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_tsl1401 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_type.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_type.c index 497ba55..af24701 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_type.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_type.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_type * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -32,6 +32,7 @@ * 日期 作者 备注 * 2022-09-15 pudding first version * 2023-05-26 pudding 新增SPI WIFI 中断回调指针 +* 2024-01-16 pudding 移除SPI WIFI 中断回调指针 SPI WIFI将不再使用外部 ********************************************************************************************************************/ #include "zf_device_type.h" @@ -45,7 +46,6 @@ callback_function camera_dma_handler = type_default_callback; wireless_type_enum wireless_type = NO_WIRELESS; callback_function wireless_module_uart_handler = type_default_callback; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 -callback_function wireless_module_spi_handler = type_default_callback; // WIFI SPI GPIO中断函数指针,根据初始化时设置的函数进行跳转 tof_type_enum tof_type = NO_TOF; callback_function tof_module_exti_handler = type_default_callback; // ToF 模块 INT 更新中断 @@ -54,7 +54,7 @@ callback_function tof_module_exti_handler = type_default_callback; // 函数简介 默认回调函数 // 参数说明 void // 返回参数 void -// 使用示例 +// 使用示例 // 备注信息 保护性冗余设计 防止在没有初始化设备的时候跑飞 //------------------------------------------------------------------------------------------------------------------- static void type_default_callback (void) @@ -90,14 +90,7 @@ void set_camera_type (camera_type_enum type_set, callback_function vsync_callba void set_wireless_type (wireless_type_enum type_set, callback_function wireless_callback) { wireless_type = type_set; - if(WIFI_SPI == wireless_type) - { - wireless_module_spi_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); - } - else - { - wireless_module_uart_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); - } + wireless_module_uart_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); } //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_type.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_type.h index 19c36ca..3b124fe 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_type.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_type.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_type * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -56,7 +56,6 @@ typedef enum WIRELESS_UART, // 无线串口 BLUETOOTH_CH9141, // 蓝牙 CH9141 WIFI_UART, // 串口 WiFi - WIFI_SPI // SPI WiFi }wireless_type_enum; typedef enum diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c index 2bdb164..3cbc786 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_virtual_oscilloscope * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h index f518026..b0fd085 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_virtual_oscilloscope * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_wifi_spi.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_wifi_spi.c index 78a6d68..f9e51ca 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_wifi_spi.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_wifi_spi.c @@ -24,14 +24,13 @@ * 文件名称 zf_device_wifi_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 * 日期 作者 备注 -* 2023-05-27 pudding first version -* 2023-05-29 pudding 新增关闭休眠指令,提升通讯效率 +* 2022-09-21 SeekFree first version ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,1374 +52,615 @@ #include "zf_common_clock.h" #include "zf_common_debug.h" #include "zf_common_fifo.h" -#include "zf_common_function.h" #include "zf_driver_delay.h" #include "zf_driver_gpio.h" -#include "zf_common_interrupt.h" -#include "zf_driver_exti.h" #include "zf_driver_spi.h" #include "zf_device_type.h" #include "zf_device_wifi_spi.h" -#define WAIT_TIME_OUT (10000) // 单指令等待时间 单位:ms +#define WIFI_CONNECT_TIME_OUT 10000 // 单位毫秒 +#define SOCKET_CONNECT_TIME_OUT 50000 // 单位毫秒 +#define OTHER_TIME_OUT 1000 // 单位毫秒 -#define WIFI_SPI_WRITE_MAX 128 // 定义一次SPI通讯最大发送的数据长度 - -#define WIFI_SPI_WRITE_REQUEST 0x01 -#define WIFI_SPI_CHECK_STATE 0x02 -#define WIFI_SPI_WRITE_DATA 0x03 -#define WIFI_SPI_READ_DATA 0x04 -#define WIFI_SPI_WRITE_END 0x07 -#define WIFI_SPI_READ_END 0x08 - -#define WIFI_SPI_WRITE_ADDR 0x00 -#define WIFI_SPI_STATE_ADDR 0x04 +char wifi_spi_version[12]; // 保存模块固件版本信息 +char wifi_spi_mac_addr[20]; // 保存模块MAC地址信息 +char wifi_spi_ip_addr_port[25]; // 保存模块IP地址与端口信息 -volatile wifi_spi_buffer_state_enum wifi_buffer_state; -volatile wifi_spi_transmit_state_enum wifi_transmit_state; - -static fifo_obj_struct wifi_spi_fifo; -static uint8 wifi_spi_buffer[WIFI_SPI_BUFFER_SIZE]; // 数据存放数组 - -vuint8 wifi_spi_ack_flag = 0; // 0:模块未应答 1:模块已应答 -uint8 wifi_spi_init_flag; // 0:模块未初始化成功或者未连接 1:模块已连接并成功初始化 -vuint8 wifi_spi_packet_num; // 发送的数据包ID -vuint32 wifi_spi_send_remain_length; // 剩余的发送长度 - - - -wifi_spi_information_struct wifi_spi_information; +static fifo_struct wifi_spi_fifo; +static uint8 wifi_spi_buffer[WIFI_SPI_RECVIVE_FIFO_SIZE]; +static volatile wifi_spi_state_enum wifi_spi_mutex; //------------------------------------------------------------------------------------------------------------------- -// 函数简介 请求写入数据到模块 -// 参数说明 length 需要写入的长度 -// @return void -// Sample usage: +// 函数简介 等待WIFI SPI就绪 +// 参数说明 wait_time 最大等待时间 单位毫秒 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_write_request(uint16 length) +static uint8 wifi_spi_wait_idle (uint32 wait_time) { - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_REQUEST; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - head.magic = 0xFE; - head.sequence = wifi_spi_packet_num++; - head.length = length; + uint32 time = 0; - wifi_transmit_state = TRANSMIT_WRITE_REQUEST; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 7); - gpio_set_level(WIFI_SPI_CS_PIN, 1); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 读取模块状态 -// 参数说明 *length 需要读取或者写入的长度 -// @return WIFI_SPI_BUFFER_STATE_enum 模块状态 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static wifi_spi_buffer_state_enum wifi_spi_read_state(uint16 *length) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_CHECK_STATE; - head.addr = WIFI_SPI_STATE_ADDR; - head.dummy = 0x00; - - wifi_spi_ack_flag = 0; - wifi_transmit_state = TRANSMIT_READ_STATE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_transfer_8bit(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, &head.cmd, 7); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - - if(BUFFER_WRITE == head.magic) + wait_time = wait_time*100; + while(0 == gpio_get_level(WIFI_SPI_INT_PIN)) { - wifi_spi_packet_num = head.sequence; - } - *length = head.length; - - return (wifi_spi_buffer_state_enum)head.magic; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据发送完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_done(void) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_END; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_transmit_state = TRANSMIT_IDLE; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据接收完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_start(void) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_READ_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - wifi_transmit_state = TRANSMIT_READ; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据接收完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_done(void) -{ - wifi_spi_buffer_struct head; - - gpio_set_level(WIFI_SPI_CS_PIN, 1); - - head.cmd = WIFI_SPI_READ_END; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_transmit_state = TRANSMIT_IDLE; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块 -// 参数说明 *buff 需要写入数据的首地址 -// 参数说明 length 需要写入数据的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_data(const uint8 *buff, uint16 length) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - wifi_transmit_state = TRANSMIT_WRITE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - spi_write_8bit_array(WIFI_SPI_INDEX, buff, length); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_spi_send_done(); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_data_multi(wifi_spi_send_multi_struct *multi_buffer) -{ - uint8 i; - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - wifi_transmit_state = TRANSMIT_WRITE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - - for(i = 0; i < WIFI_SPI_MAX_MULTI; i++) - { - if(NULL != multi_buffer->source[i]) spi_write_8bit_array(WIFI_SPI_INDEX, multi_buffer->source[i], multi_buffer->length[i]); - } - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_spi_send_done(); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 接收模块发送的数据 -// 参数说明 *buff 接收数组的缓冲区首地址 -// 参数说明 length 需要接收的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_data(uint8 *buff, uint16 length) -{ - spi_read_8bit_array(WIFI_SPI_INDEX, buff, length); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送命令到模块 -// 参数说明 *str 命令字符串首地址 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_command(const char *str) -{ - uint8 state = 0; - uint16 send_length; - uint16 wait_time = 0; - - // 请求发送数据 - send_length = (uint16)strlen(str); - - // 等待传输进入空闲 - while(TRANSMIT_IDLE != wifi_transmit_state); - - // 如果没有进入发送状态则重新请求发送数据 - while(BUFFER_WRITE != wifi_buffer_state) - { - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - while(!wifi_spi_ack_flag) - { - wait_time++; - if((WAIT_TIME_OUT / 4) <= wait_time) - { - state = 1; - wifi_spi_init_flag = 0; // 模块已断开 - break; - } - system_delay_ms(1); - } - - if(1 == state) + system_delay_us(10); + time++; + if(wait_time <= time) { break; } } - - wifi_buffer_state = BUFFER_IDLE; - - if(0 == state) // 通讯未超时 - { - wifi_spi_send_remain_length = send_length; - // 发送消息 - wifi_spi_send_data((const uint8 *)str, send_length); - } + return (wait_time <= time); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 检查模块状态并读取模块发送的数据 -// 参数说明 void -// @return void -// Sample usage: +// 函数简介 写入数据到WIFI SPI +// 参数说明 *buffer1 第一组需要发送的数据缓冲区地址 +// 参数说明 length1 第一组数据长度 +// 参数说明 *buffer2 第二组需要发送的数据缓冲区地址 +// 参数说明 length2 第二组数据长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -void wifi_spi_check_state_read_buffer(void) +static void wifi_spi_write (const uint8 *buffer1, uint16 length1, const uint8 *buffer2, uint16 length2) { - uint16 wifi_spi_receive_length; // 本次接收到的数据数量 - uint8 wifi_spi_receive_buffer[WIFI_SPI_WRITE_MAX]; - - // 查询WIFI模块的状态 - wifi_buffer_state = wifi_spi_read_state(&wifi_spi_receive_length); - - // 如果需要读取WIFI模块数据,则保存需要读取的长度 - if(BUFFER_READ == wifi_buffer_state) + gpio_low(WIFI_SPI_CS_PIN); + if(NULL != buffer1) { - wifi_spi_receive_start(); - do - { - if(wifi_spi_receive_length > WIFI_SPI_WRITE_MAX) - { - wifi_spi_receive_data((uint8 *)wifi_spi_receive_buffer, WIFI_SPI_WRITE_MAX); - fifo_write_buffer(&wifi_spi_fifo, wifi_spi_receive_buffer, WIFI_SPI_WRITE_MAX); // 存入 FIFO - wifi_spi_receive_length = wifi_spi_receive_length - WIFI_SPI_WRITE_MAX; - } - else - { - wifi_spi_receive_data((uint8 *)wifi_spi_receive_buffer, wifi_spi_receive_length); - fifo_write_buffer(&wifi_spi_fifo, wifi_spi_receive_buffer, wifi_spi_receive_length); // 存入 FIFO - wifi_spi_receive_length = 0; - } - }while(wifi_spi_receive_length > 0); - wifi_spi_receive_done(); + spi_write_8bit_array(WIFI_SPI_INDEX, buffer1, length1); } - else if(BUFFER_IDLE == wifi_buffer_state) + if(NULL != buffer2) { - // 如果模块内部缓冲区状态为空闲,则传输状态也设置为空闲 - wifi_transmit_state = TRANSMIT_IDLE; + spi_write_8bit_array(WIFI_SPI_INDEX, buffer2, length2); } + gpio_high(WIFI_SPI_CS_PIN); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块 -// 参数说明 *buff 需要发送的数据首地址 -// 参数说明 length 需要发送的长度 -// @return uint32 剩余未发送长度 -// Sample usage: +// 函数简介 WIFI SPI 发送与接收同时进行(命令收发) +// 参数说明 *packets 发送与接收的地址 +// 参数说明 length 需要接收的长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_write_data(const uint8 *buff, uint32 length) +static void wifi_spi_transfer_command (wifi_spi_packets_struct *packets, uint16 length) { - uint16 send_length; - uint32 wait_time; + gpio_low(WIFI_SPI_CS_PIN); - // 记录需要发送的长度 - wifi_spi_send_remain_length = length; - - while(wifi_spi_send_remain_length) + spi_transfer_8bit(WIFI_SPI_INDEX, (uint8 *)&(packets->head), (uint8 *)&(packets->head), sizeof(wifi_spi_head_struct)); + + if(length) { - send_length = (uint16)func_limit_ab(wifi_spi_send_remain_length, 1, WIFI_SPI_WRITE_MAX); - - // 请求发送数据 - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - - // 最长等待5秒 - wait_time = 5000; - while(!wifi_spi_ack_flag) - { - wait_time--; - if(0 == wait_time) break; - system_delay_ms(1); - } - - if(BUFFER_WRITE == wifi_buffer_state) - { - // 发送消息 - wifi_spi_send_data(buff, send_length); - buff += send_length; - wifi_spi_send_remain_length -= send_length; - wifi_buffer_state = BUFFER_IDLE; - } - else - { - break; - } + spi_transfer_8bit(WIFI_SPI_INDEX, (const uint8 *)(packets->buffer), packets->buffer, length); } - - return wifi_spi_send_remain_length; + + gpio_high(WIFI_SPI_CS_PIN); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// @return uint32 剩余未发送长度 -// Sample usage: 发送数据总长度不能超过4092个 +// 函数简介 WIFI SPI 发送与接收同时进行(数据收发) +// 参数说明 *write_data 发送的数据缓冲区地址 +// 参数说明 *read_data 接收到的数据的存储地址 +// 参数说明 length 需要接收的长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_write_data_multi(wifi_spi_send_multi_struct *multi_buffer) +static void wifi_spi_transfer_data (const uint8 *write_data, wifi_spi_packets_struct *read_data, uint16 length) { - uint16 send_length; - uint32 wait_time; + gpio_low(WIFI_SPI_CS_PIN); - // 记录需要发送的长度 - send_length = multi_buffer->length[0] + multi_buffer->length[1] + multi_buffer->length[2] + multi_buffer->length[3] + multi_buffer->length[4] + multi_buffer->length[5] + multi_buffer->length[6] + multi_buffer->length[7]; + read_data->head.command = WIFI_SPI_DATA; + read_data->head.length = length; - if(WIFI_SPI_WRITE_MAX >= send_length) + spi_transfer_8bit(WIFI_SPI_INDEX, (uint8 *)&(read_data->head), (uint8 *)&(read_data->head), sizeof(wifi_spi_head_struct)); + + if(WIFI_SPI_RECVIVE_SIZE < length) { - // 请求发送数据 - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - - // 最长等待5秒 - wait_time = 5000; - while(!wifi_spi_ack_flag) - { - wait_time--; - if(0 == wait_time) break; - system_delay_ms(1); - } - - if(BUFFER_WRITE == wifi_buffer_state) - { - // 发送消息 - wifi_spi_send_data_multi(multi_buffer); - send_length = 0; - wifi_buffer_state = BUFFER_IDLE; - } + spi_transfer_8bit(WIFI_SPI_INDEX, write_data, read_data->buffer, WIFI_SPI_RECVIVE_SIZE); + spi_write_8bit_array(WIFI_SPI_INDEX, &write_data[WIFI_SPI_RECVIVE_SIZE], length - WIFI_SPI_RECVIVE_SIZE); } - - return send_length; + else + { + // 将需要发送的数据拷贝到读取缓冲区,避免出现write_data越界访问 + memcpy(read_data->buffer, write_data, length); + spi_transfer_8bit(WIFI_SPI_INDEX, read_data->buffer, read_data->buffer, WIFI_SPI_RECVIVE_SIZE); + } + gpio_high(WIFI_SPI_CS_PIN); } -//-------------------------------------------------------------------------------------------------- -// 函数简介 等待模块响应 -// 参数说明 *wait_buffer 等待的响应的字符串 -// 参数说明 timeout 超时时间 -// 返回参数 uint8 0:模块响应指定数据 1:模块未响应指定数据或超时 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_wait_ack (char *wait_buffer, uint32 timeout) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 参数设置 +// 参数说明 command 命令类型 +// 参数说明 *buffer 参数地址 +// 参数说明 length 参数长度 +// 参数说明 wait_time 最大等待时间 单位100微妙 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_set_parameter (wifi_spi_packets_command_enum command, uint8 *buffer, uint16 length, uint32 wait_time) { - uint8 return_state = 1; - char receiver_buffer[8] = {0, 0, 0, 0, 0, 0, 0, 0}; - uint32 receiver_len = 8; - + uint8 return_state; + wifi_spi_head_struct head; + return_state = 1; do { - system_delay_ms(1); - // 判断接收缓冲区内是否有需要响应的指定数据 如果有 则跳出循环并且返回0 - receiver_len = 8; - fifo_read_tail_buffer(&wifi_spi_fifo, (uint8 *)receiver_buffer, &receiver_len, FIFO_READ_ONLY); + head.command = command; + head.length = length; + + // 等待从机准备就绪 + if(wifi_spi_wait_idle(wait_time)) + { + break; + } - if(strstr(receiver_buffer, wait_buffer)) + wifi_spi_write(&head.command, sizeof(wifi_spi_head_struct), buffer, length); + if(wifi_spi_wait_idle(wait_time)) + { + break; + } + // 接收应答信号 + + head.command = WIFI_SPI_DATA; + head.length = 0; + wifi_spi_transfer_command((wifi_spi_packets_struct *)&head, head.length); + system_delay_us(20); + if(WIFI_SPI_REPLY_OK == head.command) { return_state = 0; - break; } - else if(strstr(receiver_buffer, "ERROR") || strstr(receiver_buffer, "busy")) - { - // 如果接收到报错或者模块忙 则跳出循环并且返回1 - return_state = 1; - break; - } - }while(timeout --); + }while(0); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 清除WiFi接收缓冲区内容 -// 参数说明 void -// 返回参数 void -// 使用示例 wifi_spi_clear_receive_buffer(); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static void wifi_spi_clear_receive_buffer (void) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 模块信息获取 +// 参数说明 command 命令类型 +// 参数说明 *buffer 保存接收到的参数地址 +// 参数说明 wait_time 最大等待时间 单位100微妙 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_parameter (wifi_spi_packets_command_enum command, wifi_spi_packets_struct *read_data, uint32 wait_time) { - // 清空WiFi接收缓冲区 - fifo_clear(&wifi_spi_fifo); -} + uint8 return_state; -//-------------------------------------------------------------------------------------------------- -// 函数简介 模块数据解析 -// 参数说明 *target_buffer 目标存放地址指针 字符串数组 -// 参数说明 *origin_buffer 数据来源地址指针 字符串数组 -// 参数说明 start_char 起始提取字节 例如从 "1234" 中从 '2' 开始提取 就应该填入 '2' -// 参数说明 end_char 结束提取字节 例如从 "1234" 中在 '4' 结束提取 就应该填入 '\0'(0x00 空字符 一般是字符串结尾) -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_data_parse(wifi_spi_information.mac, wifi_spi_receive_buffer, '"', '"'); // 调用获取本机mac地址后,调用此函数提取mac地址 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char start_char, char end_char) -{ - uint8 return_state = 0; - char *location1; - char *location2; - location1 = strchr((char *)origin_buffer, start_char); - if(location1) + return_state = 1; + do { - location1 ++; - location2 = strchr(location1, end_char); - if(location2) + // 等待从机准备就绪 + if(wifi_spi_wait_idle(wait_time)) { - memcpy(target_buffer, location1, location2-location1); + break; } - else + read_data->head.command = command; + wifi_spi_write(&(read_data->head.command), WIFI_SPI_RECVIVE_SIZE, NULL, 0); + + if(wifi_spi_wait_idle(wait_time)) { - return_state = 1; + break; } - } - else - { - return_state = 1; - } + read_data->head.command = WIFI_SPI_DATA; + read_data->head.length = 0; + wifi_spi_transfer_command(read_data, WIFI_SPI_RECVIVE_SIZE); + return_state = 0; + }while(0); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 查看模块版本信息 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_get_version(); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 固件版本获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,固件版本信息以字符串形式保存在wifi_spi_version数组中 +//------------------------------------------------------------------------------------------------------------------- static uint8 wifi_spi_get_version (void) { - char *location1; - uint8 return_state = 0; - uint8 receiver_buffer[256]; - uint32 receiver_len = 256; + uint8 return_state; + wifi_spi_packets_struct temp_packets; - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+GMR\r\n"); - do + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_VERSION, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_VERSION == temp_packets.head.command)) { - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - location1 = strrchr((char *)receiver_buffer, ':'); - if(wifi_spi_data_parse(wifi_spi_information.version, (uint8 *)location1, ':', '(')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - + memcpy(wifi_spi_version, temp_packets.buffer, temp_packets.head.length); + } return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 模块回显设置 -// 参数说明 model 0:关闭模块的回写功能 其他:开启模块回写 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_echo_set("1");//开启模块回写功能 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_echo_set (char *model) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI MAC地址获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,MAC地址信息以字符串形式保存在wifi_spi_mac_addr数组中 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_mac_addr (void) { - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - if('1' == *model) + uint8 return_state; + wifi_spi_packets_struct temp_packets; + + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_MAC_ADDR, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_MAC_ADDR == temp_packets.head.command)) { - wifi_spi_send_command("ATE1\r\n"); + memcpy(wifi_spi_mac_addr, temp_packets.buffer, temp_packets.head.length); + } + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI IP地址与端口号获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 +// 需要在连接Socket之后调用此函数才能正常获取信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_ip_addr_port (void) +{ + uint8 return_state; + wifi_spi_packets_struct temp_packets; + + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_IP_ADDR, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_IP_ADDR == temp_packets.head.command)) + { + memcpy(wifi_spi_ip_addr_port, temp_packets.buffer, temp_packets.head.length); + } + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 设置连接的WiFi信息并尝试连接WiFi +// 参数说明 *wifi_ssid WIFI名称 +// 参数说明 *pass_word WIFI密码 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_wifi_connect("SEEKFREE", "SEEKFREE123"); +// 备注信息 wifi_spi_wifi_connect("SEEKFREE", NULL); // 连接没有密码的WIFI热点 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_wifi_connect (char *wifi_ssid, char *pass_word) +{ + uint8 return_state; + uint8 temp_buffer[64]; + uint16 length; + + if(NULL != pass_word) + { + // WIFI热点有密码发送热点名称与密码 + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n%s\r\n", wifi_ssid, pass_word); } else { - wifi_spi_send_command("ATE0\r\n"); + // WIFI热点没有密码只需要发送热点名称 + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n", wifi_ssid); } - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + return_state = wifi_spi_set_parameter(WIFI_SPI_SET_WIFI_INFORMATION, temp_buffer, length, WIFI_CONNECT_TIME_OUT); + + // 本机IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 + wifi_spi_get_ip_addr_port(); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块自身 的 MAC 地址 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_mac()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_mac (void) -{ - uint8 return_state = 0; - uint8 receiver_buffer[64]; - uint32 receiver_len = 64; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPAPMAC?\r\n"); - do - { - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - if(wifi_spi_data_parse(wifi_spi_information.mac, receiver_buffer, '"', '"')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块或者目标WIFI 的 IP 地址(取决于模块当前的工作模式) -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_ip()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_ip (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_STATION == wifi_spi_information.mode) - { - wifi_spi_send_command("AT+CIPSTA?\r\n"); - } - else if(WIFI_SPI_SOFTAP == wifi_spi_information.mode) - { - wifi_spi_send_command("AT+CIPAP?\r\n"); - } - - do - { - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - uint8 receiver_buffer[128]; - uint32 receiver_len = 128; - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - if(wifi_spi_data_parse(wifi_spi_information.local_ip, receiver_buffer, '"', '"')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块的相关信息 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_information()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_information (void) -{ - uint8 return_state = 0; - do - { - // 获取模块版本号 - if(wifi_spi_get_version()) - { - return_state = 1; - break; - } - // 获取模块IP地址 - if(wifi_spi_get_ip()) - { - return_state = 1; - break; - } - // 获取模块MAC信息 - if(wifi_spi_get_mac()) - { - return_state = 1; - break; - } - memcpy(wifi_spi_information.local_port, "no port", 7); - }while(0); - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 连接 WiFi -// 参数说明 wifi_ssid WiFi名称 -// 参数说明 pass_word WiFi密码 -// 参数说明 model 0:查询WiFi连接情况 其他:连接WiFi -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_get_or_connect_wifi("WiFi_name", "Pass_word", 1); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_wifi (char *wifi_ssid, char *pass_word) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SOFTAP == wifi_spi_information.mode) - { - sprintf(temp, "AT+CWSAP=\"%s\",\"%s\",5,3\r\n", wifi_ssid, pass_word); - wifi_spi_send_command(temp); - } - else - { - sprintf(temp, "AT+CWJAP=\"%s\",\"%s\"\r\n", wifi_ssid, pass_word); - wifi_spi_send_command(temp); - } - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 上电是否自动连接WiFi -// 参数说明 model 0:上电不自动连接wifi 其他:上电自动连接wifi -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_auto_connect_wifi(0); //上电不自动连接wifi -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_auto_connect_wifi (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CWAUTOCONN=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置连接模式 -// 参数说明 model 0: 单连接模式 1:多连接模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_connect_model("1"); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_connect_model (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPMUX=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置传输模式 -// 参数说明 model – 0: 普通传输模式 IP断开后不重新连接 -// – 1: Wi-Fi 透传接收模式,仅支持 TCP 单连接、UDP 固定通信对端、SSL 单连接的情况 IP断开后会不断尝试重新连接 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_transfer_model("1"); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_transfer_model (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPMODE=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置模块模式 (Station/SoftAP/Station+SoftAP) -// 参数说明 state 0:无 Wi-Fi 模式,并且关闭 Wi-Fi RF----1: Station 模式----2: SoftAP 模式----3: SoftAP+Station 模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_model("1"); +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 设置连接的Socket信息并尝试连接Socket +// 参数说明 *transport_type 传输类型 +// 参数说明 *ip_addr IP地址 +// 参数说明 *port 目标端口号 +// 参数说明 *local_port 本机端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_socket_connect("TCP", "192.168.2.5", "8080", "6060"); // 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_set_model (wifi_spi_mode_enum mode) +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_socket_connect (char *transport_type, char *ip_addr, char *port, char *local_port) { - uint8 return_state = 0; + uint8 return_state; + uint8 temp_buffer[41]; + uint16 length; + + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n%s\r\n%s\r\n%s\r\n", transport_type, ip_addr, port, local_port); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + return_state = wifi_spi_set_parameter(WIFI_SPI_SET_SOCKET_INFORMATION, temp_buffer, length, SOCKET_CONNECT_TIME_OUT); - if(WIFI_SPI_SOFTAP == mode) - { - wifi_spi_send_command("AT+CWMODE=2\r\n"); - } - else - { - wifi_spi_send_command("AT+CWMODE=1\r\n"); - } - // 设置模块工作模式 - wifi_spi_information.mode = mode; - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + // 本机IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 + wifi_spi_get_ip_addr_port(); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 关闭睡眠模式 -// 参数说明 mode -// 返回参数 uint8 0:成功 1:失败 +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 断开Socket连接 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_socket_disconnect(); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_socket_disconnect (void) +{ + wifi_spi_packets_struct temp_packets; + + return wifi_spi_get_parameter(WIFI_SPI_CLOSE_SOCKET, &temp_packets, OTHER_TIME_OUT); +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 软复位 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 // 使用示例 // 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_close_sleep_model (void) +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_reset (void) { - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+SLEEP=0\r\n"); - // 设置模块工作模式 - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 断开与wifi的连接 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_disconnected_wifi(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_disconnected_wifi (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CWQAP\r\n"); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 进入打开透传模式 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_entry_serianet(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_entry_serianet (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPSEND\r\n"); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 退出透传模式 -// 参数说明 model 0:关闭透传模式 其他:开启透传模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_exit_serianet(1); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_exit_serianet (void) -{ - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - system_delay_ms(20); - wifi_spi_send_command("+++"); - system_delay_ms(1000); - - return 0; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 建立TCP连接 -// 参数说明 ip 远端 IPv4 地址、IPv6 地址,或域名 -// 参数说明 port 远端端口值 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_connect_tcp_servers("192.168.101.110", "8080"); -// 备注信息 如果总是连接不上电脑的TCP服务器 可以尝试使用网线连接电脑 -// 如果是使用WiFi连接 可能会导致模块连接TCP服务器等待较长时间 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_connect_tcp_servers (char *ip, char *port, wifi_spi_transfer_mode_enum mode) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + uint8 return_state; + wifi_spi_head_struct head; + return_state = 1; do { - if(wifi_spi_set_connect_model("0")) + head.command = WIFI_SPI_RESET; + head.length = 0xA5A5; + return_state = wifi_spi_wait_idle(OTHER_TIME_OUT); + if(return_state) { - return_state = 1; break; } + wifi_spi_write(&head.command, sizeof(wifi_spi_head_struct), NULL, 0); + }while(0); + + return return_state; +} - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPSTARTEX=\"TCP\",\"%s\",%s\r\n", ip, port); - wifi_spi_send_command(temp); - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI UDP模式时立即发送函数 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 在UDP模式下模块收到数据后会等待2毫秒,2毫秒后未收到数据则将数据通过socket发送到网络,如果希望立即发送则在数据传输完毕后调用此函数 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_udp_send_now (void) +{ + uint8 return_state = 1; + wifi_spi_packets_struct temp_packets; + + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + do { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - // 设置传输模式 - if(wifi_spi_set_transfer_model(WIFI_SPI_COMMAND == mode ? "0" : "1")) - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPSTATE?\r\n"); - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - else - { - uint8 receiver_buffer[128]; - uint32 receiver_len = 128; - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - char* buffer_index = (char *)receiver_buffer; - char* end_index; - - buffer_index += 22; - buffer_index += strlen(ip); - buffer_index += strlen(port); - end_index = strchr(buffer_index, ','); - - memcpy(wifi_spi_information.local_port, " ", 7); - memcpy(wifi_spi_information.local_port, buffer_index, (end_index - buffer_index)); - } - - wifi_spi_information.connect_state = WIFI_SPI_SERVER_ON; - wifi_spi_information.connect_mode = WIFI_SPI_TCP_CLIENT; - wifi_spi_information.transfer_mode = mode; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SERIANET == mode) // 透传模式下直接开启透传 - { - if(wifi_spi_entry_serianet()) + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) { - return_state = 1; break; } - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 建立UDP连接 -// 参数说明 *ip 远端 IPv4 地址、IPv6 地址 或域名 字符串形式 -// 参数说明 *port 远端端口值 字符串形式 -// 参数说明 *local_port 远端 IPv4 地址、IPv6 地址 或域名 字符串形式 -// 参数说明 mode 模块数据通信模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_connect_udp_client("192.168.101.110", "8080", "8080", WIFI_SPI_COMMAND); -// 备注信息 自动分配ID -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_connect_udp_client (char *ip, char *port, char *local_port, wifi_spi_transfer_mode_enum mode) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - do - { - if(wifi_spi_set_connect_model("0")) - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + // 立即开始socket发送 + temp_packets.head.command = WIFI_SPI_UDP_SEND; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + + // 等待应答信号 + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + + // 接收应答信号 + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, temp_packets.head.length); + + if(WIFI_SPI_REPLY_OK == temp_packets.head.command) + { + return_state = 0; + } + + }while(0); - sprintf(temp, "AT+CIPSTARTEX=\"UDP\",\"%s\",%s,%s\r\n", ip, port, local_port); - wifi_spi_send_command(temp); + // 将通讯状态设置为空闲 + wifi_spi_mutex = WIFI_SPI_IDLE; + } + + return return_state; +} - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 数据块发送函数并同步接收数据 +// 参数说明 *buff 需要发送的数据地址 +// 参数说明 length 发送长度 +// 返回参数 uint32 剩余未发送的长度 +// 使用示例 wifi_spi_send_buffer(buffer, 100); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +uint32 wifi_spi_send_buffer (const uint8 *buffer, uint32 length) +{ + uint16 send_length; + wifi_spi_packets_struct temp_packets; + + // 检查WIFI SPI状态,如果在其他中断或者线程中已经发起了通讯,则本次不能发送数据 + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + + while(length) { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_spi_set_transfer_model(WIFI_SPI_COMMAND == mode ? "0" : "1")) // 设置传输模式 - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SERIANET == mode) // 透传模式下直接开启透传 - { - if(wifi_spi_entry_serianet()) + send_length = length > WIFI_SPI_TRANSFER_SIZE ? (uint16)WIFI_SPI_TRANSFER_SIZE : (uint16)length; + + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) { - return_state = 1; break; } - } - memcpy(wifi_spi_information.local_port, " ", 7); - memcpy(wifi_spi_information.local_port, local_port, strlen(local_port)); - wifi_spi_information.connect_state = WIFI_SPI_SERVER_ON; - wifi_spi_information.connect_mode = WIFI_SPI_UDP_CLIENT; - wifi_spi_information.transfer_mode = mode; - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 断开连接 TCP Server 使用本接口将会断开所有连接 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_disconnect_link(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_disconnect_link (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - do - { - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - wifi_spi_send_command("AT+CIPCLOSE=5\r\n"); - } - else - { - wifi_spi_send_command("AT+CIPCLOSE\r\n"); - } - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送字节函数 -// 参数说明 data 需要发送的数据 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_byte(0xa5); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_byte (uint8 data) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - send_length = 1; - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data(&data, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else - { - send_length = (uint16)wifi_spi_write_data(&data, send_length); - } - } - } - - return send_length; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送缓冲区函数 -// 参数说明 buff 需要发送的数据地址 -// 参数说明 len 发送长度 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_buffer("123", 3); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 len) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - while(len) - { - if((WIFI_SPI_WRITE_MAX * 2) < len) send_length = WIFI_SPI_WRITE_MAX * 2; - else - { - send_length = (uint16)len; - } - len -= send_length; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data(buff, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } - buff += send_length; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else - { - len = wifi_spi_write_data(buff, len); - } - } - } - - return len; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送缓冲区函数(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 -// 备注信息 需要发送多个数组时,采用此函数可以极大的降低通讯时间,发送数据总长度不能超过4092 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_buffer_multi (wifi_spi_send_multi_struct *multi_buffer) -{ - uint8 i; - uint16 remain_length; - - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - for(i = 0; i < WIFI_SPI_MAX_MULTI; i++) - { - if(multi_buffer->source[i]) wifi_spi_send_buffer(multi_buffer->source[i], multi_buffer->length[i]); - } - } - else - { - remain_length = (uint16)wifi_spi_write_data_multi(multi_buffer); - } - } - } - - return remain_length; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送字符串函数 -// 参数说明 *str 需要发送的数据 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_string("123"); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_string (const char *str) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - send_length = (uint16)strlen(str); - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data((uint8 *)str, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } + wifi_spi_transfer_data(buffer, &temp_packets, send_length); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) { - send_length = (uint16)wifi_spi_write_data((uint8 *)str, send_length); + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + + length -= send_length; + buffer += send_length; + } + + // 检查最后一次的接收是否将所有的数据都接收完毕 + while(WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) + { + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + + // 继续读取模块剩余数据 + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } } } + wifi_spi_mutex = WIFI_SPI_IDLE; } - - return send_length; + return length; } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi 模块数据接收函数 -// 参数说明 buffer 接收数据的存放地址 -// 参数说明 len 数组长度,可直接填写或者使用sizeof求得 -// 返回参数 uint32 返回实际接收到的数据长度 -// 使用示例 uint8 test_buffer[256]; wifi_spi_read_buffer(&test_buffer[0], sizeof(test_buffer)); +// 函数简介 WIFI SPI 读取缓冲区 +// 参数说明 *buff 接收缓冲区 +// 参数说明 length 读取数据长度 +// 返回参数 uint32 实际读取数据长度 +// 使用示例 wifi_spi_read_buffer(buffer, 100); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 len) +uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 length) { - fifo_read_buffer(&wifi_spi_fifo, buffer, &len, FIFO_READ_AND_CLEAN); - return len; + zf_assert(NULL != buffer); + uint32 data_len = length; + +#if(1 == WIFI_SPI_READ_TRANSFER) + + wifi_spi_packets_struct temp_packets; + // 检查WIFI SPI状态,如果在其他中断或者线程中已经发起了通讯,则本次不能发送数据 + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + + // 发起通讯查看模块内是否有数据未读取 + do + { + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + }while(WIFI_SPI_REPLY_DATA_START == temp_packets.head.command); + wifi_spi_mutex = WIFI_SPI_IDLE; + } +#endif + + fifo_read_buffer(&wifi_spi_fifo, buffer, &data_len, FIFO_READ_AND_CLEAN); + return data_len; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 wifi spi handshake中断回调函数 -// 参数说明 void -// 返回参数 void -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -void wifi_spi_callback (void) -{ - wifi_spi_check_state_read_buffer(); - wifi_spi_ack_flag = 1; // ACK标志位置1 -} - - //------------------------------------------------------------------------------------------------------------------- // 函数简介 WiFi 模块初始化 // 参数说明 *wifi_ssid 目标连接的 WiFi 的名称 字符串形式 // 参数说明 *pass_word 目标连接的 WiFi 的密码 字符串形式 -// 参数说明 wifi_mode 模块的工作模式 参照 zf_device_wireless_spi.h 中 wifi_spi_mode_enum 枚举 // 返回参数 uint8 模块初始化状态 0-成功 1-错误 -// 使用示例 wifi_spi_init("SEEKFREE_2.4G", "SEEKFREEV2", WIFI_UART_STATION); -// 备注信息 初始化会首先设置串口配置,之后会对模块进行基本参数配置 -// 具体的配置信息可以在 zf_device_wireless_spi.h 文件中修改 +// 使用示例 wifi_spi_init("SEEKFREE", "SEEKFREE123"); +// 备注信息 wifi_spi_init("SEEKFREE", NULL); // 连接没有密码的WIFI热点 //------------------------------------------------------------------------------------------------------------------- -uint8 wifi_spi_init (char *wifi_ssid, char *pass_word, wifi_spi_mode_enum wifi_mode) +uint8 wifi_spi_init (char *wifi_ssid, char *pass_word) { uint8 return_state = 0; - uint32 temp_isr; - - spi_init(WIFI_SPI_INDEX, SPI_MODE0, WIFI_SPI_SPEED, WIFI_SPI_SCK_PIN, WIFI_SPI_MOSI_PIN, WIFI_SPI_MISO_PIN, SPI_CS_NULL);//硬件SPI初始化 - set_wireless_type(WIFI_SPI, wifi_spi_callback); - fifo_init(&wifi_spi_fifo, FIFO_DATA_8BIT, wifi_spi_buffer, WIFI_SPI_BUFFER_SIZE); + fifo_init(&wifi_spi_fifo, FIFO_DATA_8BIT, wifi_spi_buffer, WIFI_SPI_RECVIVE_FIFO_SIZE); + spi_init(WIFI_SPI_INDEX, SPI_MODE3, WIFI_SPI_SPEED, WIFI_SPI_SCK_PIN, WIFI_SPI_MOSI_PIN, WIFI_SPI_MISO_PIN, SPI_CS_NULL);//硬件SPI初始化 gpio_init(WIFI_SPI_CS_PIN, GPO, 1, GPO_PUSH_PULL); gpio_init(WIFI_SPI_RST_PIN, GPO, 1, GPO_PUSH_PULL); - - temp_isr = interrupt_global_disable(); - - exti_init(WIFI_SPI_INT_PIN, EXTI_TRIGGER_RISING); - + gpio_init(WIFI_SPI_INT_PIN, GPI, 0, GPI_PULL_DOWN); + + // 复位 gpio_set_level(WIFI_SPI_RST_PIN, 0); - system_delay_ms(50); + system_delay_ms(10); gpio_set_level(WIFI_SPI_RST_PIN, 1); - system_delay_ms(1000); + + // 等待模块初始化 + system_delay_ms(100); + wifi_spi_mutex = WIFI_SPI_IDLE; - exti_flag_clear(WIFI_SPI_INT_PIN); - - interrupt_global_enable(temp_isr); do { - if(wifi_spi_echo_set("0")) // 关闭模块回写 + // 固件版本信息以字符串形式保存在wifi_spi_version数组中 + return_state = wifi_spi_get_version(); + if(return_state) + { + break; + } + + // MAC地址信息以字符串形式保存在wifi_spi_mac_addr数组中 + wifi_spi_get_mac_addr(); + + + return_state = wifi_spi_wifi_connect(wifi_ssid, pass_word); + if(return_state) { - zf_log(0, "exit echo failed"); - return_state = 1; break; } - if(wifi_spi_auto_connect_wifi("0")) // 关闭自动连接 + #if(1 == WIFI_SPI_AUTO_CONNECT) + return_state = wifi_spi_socket_connect("TCP", WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT); + if(return_state) { - zf_log(0, "close auto connect failed"); - return_state = 1; break; } - - if(wifi_spi_set_model(wifi_mode)) // 设置运行模式 + #endif + + #if(2 == WIFI_SPI_AUTO_CONNECT) + return_state = wifi_spi_socket_connect("UDP", WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT); + if(return_state) { - zf_log(0, "set run mode failed"); - return_state = 1; break; } - - if(wifi_spi_close_sleep_model()) // 关闭睡眠模式 - { - zf_log(0, "set sleep mode failed"); - return_state = 1; - break; - } - - if(wifi_spi_set_wifi((char *)wifi_ssid, (char *)pass_word)) // 连接 wifi 或者开启热点 - { - zf_log(0, "wifi set failed"); - return_state = 1; - break; - } - - if(wifi_spi_get_information()) // 模块基本参数获取 - { - zf_log(0, "get module information failed"); - return_state = 1; - break; - } -#if WIFI_SPI_AUTO_CONNECT == 1 - if(wifi_spi_connect_tcp_servers(WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_SERIANET)) // 连接TCP服务器 - { - zf_log(0, "connect TCP server failed"); - return_state = 1; - break; - } -#endif -#if WIFI_SPI_AUTO_CONNECT == 2 - if(wifi_spi_connect_udp_client(WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT, WIFI_SPI_SERIANET)) // 建立UDP连接 - { - zf_log(0, "connect UDP server failed"); - return_state = 1; - break; - } -#endif - // 模块初始化成功 - wifi_spi_init_flag = 1; + #endif }while(0); - + return return_state; } diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_wifi_spi.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_wifi_spi.h index 5e5a025..24e7eb1 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_wifi_spi.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_wifi_spi.h @@ -24,13 +24,13 @@ * 文件名称 zf_device_wifi_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 * 日期 作者 备注 -* 2023-05-27 pudding first version +* 2024-01-18 SeekFree first version ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,128 +53,100 @@ #include "zf_common_typedef.h" + #define WIFI_SPI_INDEX (SPI_3 ) // 定义使用的SPI号 -#define WIFI_SPI_SPEED (30 * 1000 * 1000 ) // 硬件 SPI 速率 +#define WIFI_SPI_SPEED (50 * 1000 * 1000 ) // 硬件 SPI 速率 #define WIFI_SPI_SCK_PIN (SPI3_SCLK_P22_3 ) // 定义SPI_SCK引脚 #define WIFI_SPI_MOSI_PIN (SPI3_MOSI_P22_0 ) // 定义SPI_MOSI引脚 #define WIFI_SPI_MISO_PIN (SPI3_MISO_P22_1 ) // 定义SPI_MISO引脚 IPS没有MISO引脚,但是这里任然需要定义,在spi的初始化时需要使用 #define WIFI_SPI_CS_PIN (P22_2 ) // 定义SPI_CS引脚 采用软件CS引脚 -#define WIFI_SPI_INT_PIN (ERU_CH5_REQ1_P15_8) // 定义中断引脚 +#define WIFI_SPI_INT_PIN (P15_8 ) // 定义握手引脚 #define WIFI_SPI_RST_PIN (P23_1 ) // 定义复位引脚 - - -#define WIFI_SPI_BUFFER_SIZE (1024) // 定义SPI接收的缓冲区大小 -#define WIFI_SPI_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不连接 1-自动连接TCP服务器并进入透传模式 2-自动连接UDP服务器并进入透传模式 3:自动建立TCP服务器 - -#if (WIFI_SPI_AUTO_CONNECT > 2) + +#define WIFI_SPI_RECVIVE_FIFO_SIZE (1024) // 接收FIFO大小 +#define WIFI_SPI_READ_TRANSFER (1) // 在调用wifi_spi_read_buffer 是否尝试发起SPI通讯来检测模块内是否有数据需要读取 1:发起SPI通讯 0:不发起SPI通讯,仅读取FIFO + // 如果应用程序中没有任何的地方调用发送函数,则WIFI_SPI_READ_TRANSFER必须设置为1 + +#define WIFI_SPI_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不自动连接 1-自动连接TCP服务器 2-自动连接UDP + +#if (WIFI_SPI_AUTO_CONNECT > 2) #error "WIFI_SPI_AUTO_CONNECT 的值只能为 [0,1,2]" #else -#define WIFI_SPI_TARGET_IP "192.168.2.28" // 连接目标的 IP +#define WIFI_SPI_TARGET_IP "192.168.137.1" // 连接目标的 IP #define WIFI_SPI_TARGET_PORT "8080" // 连接目标的端口 -#define WIFI_SPI_LOCAL_PORT "8080" // 本机端口 +#define WIFI_SPI_LOCAL_PORT "6666" // 本机的端口 0:随机 可设置范围2048-65535 默认 6666 #endif -#define WIFI_SPI_MAX_MULTI (17) // 多地址发送,最大8个地址 -typedef enum -{ - BUFFER_IDLE, // 模块的缓冲区是空闲的 - BUFFER_READ, // 模块的缓冲区有数据需要读取 - BUFFER_WRITE, // 模块的缓冲区是可写的 -}wifi_spi_buffer_state_enum; +#define WIFI_SPI_RECVIVE_SIZE (32) // 每次SPI传输接收的字节数 不允许修改 +#define WIFI_SPI_TRANSFER_SIZE (4088) // 最大SPI传输接收的字节数 不允许修改 + + typedef enum -{ - TRANSMIT_IDLE, // 当前没有传输 - TRANSMIT_WRITE_REQUEST, // 给模块发送了一个传输请求 - TRANSMIT_READ_STATE, // 读取模块状态 - TRANSMIT_READ, // 正在读取模块内部数据 - TRANSMIT_WRITE, // 正在往模块写入数据 -}wifi_spi_transmit_state_enum; - -typedef enum -{ - WIFI_SPI_STATION, // 设备模式 - WIFI_SPI_SOFTAP, // AP模式 -}wifi_spi_mode_enum; - -typedef enum -{ - WIFI_SPI_COMMAND, // 使用命令的方式发送数据 - WIFI_SPI_SERIANET, // 使用透传的方式发送数据 -}wifi_spi_transfer_mode_enum; - -typedef enum -{ - WIFI_SPI_TCP_CLIENT, // 模块连接TCP服务器 - WIFI_SPI_TCP_SERVER, // 模块作为TCP服务器 - WIFI_SPI_UDP_CLIENT, // 模块启用UDP连接 -}wifi_spi_connect_mode_enum; - -typedef enum -{ - WIFI_SPI_SERVER_OFF, // 模块未连接服务器 - WIFI_SPI_SERVER_ON, // 模块已经连接服务器 -}wifi_spi_connect_state_enum; - -typedef enum -{ - WIFI_SPI_LINK_0, // 模块当前链接 0 - WIFI_SPI_LINK_1, // 模块当前链接 1 - WIFI_SPI_LINK_2, // 模块当前链接 2 - WIFI_SPI_LINK_3, // 模块当前链接 3 - WIFI_SPI_LINK_4, // 模块当前链接 4 -}wifi_spi_link_id_enum; - -typedef struct { - uint8 reserve; - uint8 cmd; - uint8 addr; - uint8 dummy; - uint8 magic; - uint8 sequence; - uint16 length; -}wifi_spi_buffer_struct; + // 主机发送的命令 + WIFI_SPI_INVALID1 = 0x00, // 无效数据包 + WIFI_SPI_RESET = 0x01, // 复位命令 + WIFI_SPI_DATA = 0x02, // 透传数据包 + WIFI_SPI_UDP_SEND = 0x03, // UDP下立即发送命令,默认SPI接收数据后2MS未收到数据自动发送数据 + WIFI_SPI_CLOSE_SOCKET = 0x04, // 断开连接 + + WIFI_SPI_SET_WIFI_INFORMATION = 0x10, // 设置WIFI信息命令 + WIFI_SPI_SET_SOCKET_INFORMATION = 0x11, // 设置SOCKET信息命令 + + WIFI_SPI_GET_VERSION = 0x20, // 获取模块版本 + WIFI_SPI_GET_MAC_ADDR = 0x21, // 获取模块MAC地址 + WIFI_SPI_GET_IP_ADDR = 0x22, // 获取模块IP地址 + + // 从机回传的命令 + WIFI_SPI_REPLY_OK = 0x80, // 从机应答的正确命令 + WIFI_SPI_REPLY_ERROR = 0x81, // 从机应答的错误命令 + + WIFI_SPI_REPLY_DATA_START = 0x90, // 从机回传的数据包,并且还有数据需要主机读取 + WIFI_SPI_REPLY_DATA_END = 0x91, // 从机回传的数据包,数据已读取完毕 + + WIFI_SPI_REPLY_VERSION = 0xA0, // 从机回复固件版本 + WIFI_SPI_REPLY_MAC_ADDR = 0xA1, // 从机回复本机MAC地址等信息 + WIFI_SPI_REPLY_IP_ADDR = 0xA2, // 从机回复本机IP地址、端口号 + WIFI_SPI_INVALID2 = 0xFF // 无效数据包 +}wifi_spi_packets_command_enum; + +typedef enum +{ + WIFI_SPI_IDLE, // 模块空闲,可以进行SPI通讯 + WIFI_SPI_BUSY, // 模块正忙,不可进行SPI通讯 +}wifi_spi_state_enum; + + +typedef struct +{ + uint8 command; // 命令字 + uint8 reserve; // 保留 + uint16 length; // 包有效长度 +}wifi_spi_head_struct; + + +typedef struct +{ + wifi_spi_head_struct head; // 帧头 + uint8 buffer[WIFI_SPI_RECVIVE_SIZE]; // 缓冲区 +}wifi_spi_packets_struct; + + +extern char wifi_spi_version[12]; // 固件版本 字符串 +extern char wifi_spi_mac_addr[20]; // 模块MAC地址 字符串 +extern char wifi_spi_ip_addr_port[25]; // IP地址与端口号 字符串 -typedef struct -{ - uint8 version[12]; // 固件版本 字符串形式 - uint8 mac[20]; // 本机 MAC 地址 字符串形式 - uint8 local_ip[17]; // 本机 IP 地址 字符串形式 - uint8 local_port[10]; // 本机端口号 字符串形式 - uint8 remote_ip[5][17]; // 远端 IP 地址 字符串形式 - wifi_spi_mode_enum mode; // WIFI 模式 - wifi_spi_transfer_mode_enum transfer_mode; // 当前传输模式 - wifi_spi_connect_mode_enum connect_mode; // 网络连接模式 - wifi_spi_connect_state_enum connect_state; // 服务器连接情况 -}wifi_spi_information_struct; +uint8 wifi_spi_wifi_connect (char *wifi_ssid, char *pass_word); +uint8 wifi_spi_socket_connect (char *transport_type, char *ip_addr, char *port, char *local_port); +uint8 wifi_spi_socket_disconnect (void); +uint8 wifi_spi_udp_send_now (void); +uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 length); +uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 length); -typedef struct -{ - uint8 *source[WIFI_SPI_MAX_MULTI]; - uint16 length[WIFI_SPI_MAX_MULTI]; -}wifi_spi_send_multi_struct; - -extern wifi_spi_information_struct wifi_spi_information; - - -uint8 wifi_spi_disconnected_wifi (void); // 断开 WIFI 连接 -uint8 wifi_spi_entry_serianet (void); // 打开透传模式 -uint8 wifi_spi_exit_serianet (void); // 关闭透传模式 - -uint8 wifi_spi_connect_tcp_servers (char *ip, char *port, wifi_spi_transfer_mode_enum mode); // 建立 TCP 连接 -uint8 wifi_spi_connect_udp_client (char *ip, char *port, char *local_port, wifi_spi_transfer_mode_enum mode); // 建立 UDP 传输 -uint8 wifi_spi_disconnect_link (void); // 断开连接 TCP Server 使用本接口将会断开所有连接 - -uint32 wifi_spi_send_byte (uint8 data); // WIFI 模块发送字节函数 -uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 length); // WIFI 模块发送缓冲区函数 -uint32 wifi_spi_send_buffer_multi (wifi_spi_send_multi_struct *multi_buffer); // WIFI 模块发送多缓冲区函数 -uint32 wifi_spi_send_string (const char *str); // WIFI 模块发送字符串函数 - -uint32 wifi_spi_read_buffer (uint8 *buff, uint32 len); // WIFI 模块数据接收函数 - -uint8 wifi_spi_init (char *wifi_ssid, char *pass_word, wifi_spi_mode_enum wifi_mode); // WIFI 模块初始化函数 +uint8 wifi_spi_init (char *wifi_ssid, char *pass_word); #endif + diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_wifi_uart.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_wifi_uart.c index 312dab7..ff728bb 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_wifi_uart.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_wifi_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_wifi_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -61,7 +61,7 @@ wifi_uart_information_struct wifi_uart_information; // 模块自身参数 -static fifo_obj_struct wifi_uart_fifo; +static fifo_struct wifi_uart_fifo; static uint8 wifi_uart_buffer[WIFI_UART_BUFFER_SIZE]; // 数据存放数组 static uint8 wifi_uart_data; diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_wifi_uart.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_wifi_uart.h index abcb253..3316b6f 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_wifi_uart.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_wifi_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_wifi_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_wireless_uart.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_wireless_uart.c index eac2867..91ec013 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_wireless_uart.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_wireless_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_wireless_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -53,7 +53,7 @@ #include "zf_device_type.h" #include "zf_device_wireless_uart.h" -static fifo_obj_struct wireless_uart_fifo; +static fifo_struct wireless_uart_fifo; static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; static uint8 wireless_uart_data = 0; diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_wireless_uart.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_wireless_uart.h index 2418545..a789ad0 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_wireless_uart.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_wireless_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_wireless_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -61,11 +61,11 @@ // 注意事项2:开启自动波特率务必连接RTS引脚 否则会开启失败。 // 注意事项3:模块自动波特率失败的话 可以尝试断电重启 -// 开启自动波特率务必阅读上面两条 注意事项 -// 开启自动波特率务必阅读上面两条 注意事项 -// 开启自动波特率务必阅读上面两条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 -// 0:关闭自动波特率 +// 0:关闭自动波特率 // 1:开启自动波特率 自动波特率的作用是修改 WIRELESS_UART_BAUD 之后不需要对模块进行配置 模块会自动设置为对应的波特率 #define WIRELESS_UART_AUTO_BAUD_RATE ( 1 ) diff --git a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_adc.c b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_adc.c index 9a262a1..06694d8 100644 --- a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_adc.c +++ b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_adc.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_adc * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_adc.h b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_adc.h index 378b67e..f017c76 100644 --- a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_adc.h +++ b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_adc.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_adc * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_delay.c b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_delay.c index 4ec533c..ae3e610 100644 --- a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_delay.c +++ b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_delay.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_delay * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_delay.h b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_delay.h index e8d82ef..7b8b475 100644 --- a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_delay.h +++ b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_delay.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_delay * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_dma.c b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_dma.c index f72f1d6..43bffbc 100644 --- a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_dma.c +++ b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_dma.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_dma * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_dma.h b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_dma.h index 1ec555b..320d40c 100644 --- a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_dma.h +++ b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_dma.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_dma * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_encoder.c b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_encoder.c index 6592198..0e0e0b9 100644 --- a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_encoder.c +++ b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_encoder.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_encoder.h b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_encoder.h index 68d159f..e079122 100644 --- a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_encoder.h +++ b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_encoder.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_exti.c b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_exti.c index 72c9a1f..31d270a 100644 --- a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_exti.c +++ b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_exti.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_exti * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_exti.h b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_exti.h index 30f5ef6..b63f9ee 100644 --- a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_exti.h +++ b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_exti.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_exti * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_flash.c b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_flash.c index f91f5a0..325cfed 100644 --- a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_flash.c +++ b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_flash.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_flash * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_flash.h b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_flash.h index 912585a..e7425fd 100644 --- a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_flash.h +++ b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_flash.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_flash * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_gpio.c b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_gpio.c index 5071114..a084353 100644 --- a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_gpio.c +++ b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_gpio.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_gpio * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_gpio.h b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_gpio.h index 2b23be0..550fb8d 100644 --- a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_gpio.h +++ b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_gpio.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_gpio * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_pit.c b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_pit.c index c4dc50d..5e03d38 100644 --- a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_pit.c +++ b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_pit.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pit * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_pit.h b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_pit.h index 5461e05..66854b5 100644 --- a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_pit.h +++ b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_pit.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pit * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_pwm.c b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_pwm.c index ad1059a..24d8d7a 100644 --- a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_pwm.c +++ b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_pwm.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pwm * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_pwm.h b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_pwm.h index d6dce78..51948a4 100644 --- a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_pwm.h +++ b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_pwm.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pwm * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_soft_iic.c b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_soft_iic.c index 9833b62..a349ec7 100644 --- a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_soft_iic.c +++ b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_soft_iic.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_iic * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_soft_iic.h b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_soft_iic.h index a62b262..80db53b 100644 --- a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_soft_iic.h +++ b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_soft_iic.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_iic * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_soft_spi.c b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_soft_spi.c index 292c60b..954fbe3 100644 --- a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_soft_spi.c +++ b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_soft_spi.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_soft_spi.h b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_soft_spi.h index 6a9c207..62858de 100644 --- a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_soft_spi.h +++ b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_soft_spi.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_spi.c b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_spi.c index 1b99196..f817dd9 100644 --- a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_spi.c +++ b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_spi.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -920,7 +920,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 do { - IfxQspi_writeTransmitFifo(moudle, (uint8)(*write_buffer & 0xFF00) >> 8); // 将发送的数据写入缓冲区 + IfxQspi_writeTransmitFifo(moudle, (uint8)((*write_buffer & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 if(read_buffer != NULL) { diff --git a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_spi.h b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_spi.h index e73507e..d15589c 100644 --- a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_spi.h +++ b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_spi.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_timer.c b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_timer.c index a953b92..e085d6e 100644 --- a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_timer.c +++ b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_timer.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_timer * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_timer.h b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_timer.h index 3c86f58..1bb348f 100644 --- a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_timer.h +++ b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_timer.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_timer * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_uart.c b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_uart.c index cd19782..fb89b55 100644 --- a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_uart.c +++ b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_uart.h b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_uart.h index 8d1d111..cdc55ab 100644 --- a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_uart.h +++ b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E01_gpio_demo/user/isr.c b/Example/E01_gpio_demo/user/isr.c index 27171d2..9108ff0 100644 --- a/Example/E01_gpio_demo/user/isr.c +++ b/Example/E01_gpio_demo/user/isr.c @@ -24,7 +24,7 @@ * 文件名称 isr * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -118,7 +118,7 @@ IFX_INTERRUPT(exti_ch1_ch5_isr, 0, EXTI_CH1_CH5_INT_PRIO) { exti_flag_clear(ERU_CH5_REQ1_P15_8); - wireless_module_spi_handler(); // SPI WIFI 中断回调函数 + } } diff --git a/Example/E02_uart_demo/libraries/doc/version.txt b/Example/E02_uart_demo/libraries/doc/version.txt index b841b50..d644136 100644 --- a/Example/E02_uart_demo/libraries/doc/version.txt +++ b/Example/E02_uart_demo/libraries/doc/version.txt @@ -1,3 +1,8 @@ +V3.2.6 + 更新逐飞助手接口函数 调用初始化时直接传参通信类 + 更新wifi SPI驱动文件 提高通信效率 + 更新GPS驱动文件,更名为GNSS,兼容普通定位模块及RTK + V3.2.5 修复延时函数初始化参数及中断向量表问题 V3.2.4 diff --git a/Example/E02_uart_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h b/Example/E02_uart_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h index 28ff689..371e6b6 100644 --- a/Example/E02_uart_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h +++ b/Example/E02_uart_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h @@ -34,7 +34,7 @@ /*------------------------------------------Configuration for IfxScu_cfg.h-------------------------------------------*/ /*********************************************************************************************************************/ /* External oscillator frequency in Hz */ -#define IFX_CFG_SCU_XTAL_FREQUENCY (20000000) /* Allowed values are: 16000000, 20000000 or 40000000 */ +#define IFX_CFG_SCU_XTAL_FREQUENCY (20000000) /* Allowed values are9p: 16000000, 20000000 or 40000000 */ /* PLL frequency in Hz */ #define IFX_CFG_SCU_PLL_FREQUENCY (200000000) /* Allowed values are: 80000000, 133000000, 160000000 * or 200000000 */ diff --git a/Example/E02_uart_demo/libraries/zf_common/zf_common_clock.c b/Example/E02_uart_demo/libraries/zf_common/zf_common_clock.c index 5023270..9872ea9 100644 --- a/Example/E02_uart_demo/libraries/zf_common/zf_common_clock.c +++ b/Example/E02_uart_demo/libraries/zf_common/zf_common_clock.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_clock * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_common/zf_common_clock.h b/Example/E02_uart_demo/libraries/zf_common/zf_common_clock.h index 9face65..2b50396 100644 --- a/Example/E02_uart_demo/libraries/zf_common/zf_common_clock.h +++ b/Example/E02_uart_demo/libraries/zf_common/zf_common_clock.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_clock * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_common/zf_common_debug.c b/Example/E02_uart_demo/libraries/zf_common/zf_common_debug.c index 52c623d..d680265 100644 --- a/Example/E02_uart_demo/libraries/zf_common/zf_common_debug.c +++ b/Example/E02_uart_demo/libraries/zf_common/zf_common_debug.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_debug * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -46,7 +46,7 @@ static volatile uint8 zf_debug_assert_enable = 1; #if DEBUG_UART_USE_INTERRUPT // 如果启用 debug uart 接收中断 uint8 debug_uart_buffer[DEBUG_RING_BUFFER_LEN]; // 数据存放数组 uint8 debug_uart_data; -fifo_obj_struct debug_uart_fifo; +fifo_struct debug_uart_fifo; #endif //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E02_uart_demo/libraries/zf_common/zf_common_debug.h b/Example/E02_uart_demo/libraries/zf_common/zf_common_debug.h index 881a297..4fb4d91 100644 --- a/Example/E02_uart_demo/libraries/zf_common/zf_common_debug.h +++ b/Example/E02_uart_demo/libraries/zf_common/zf_common_debug.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_debug * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_common/zf_common_fifo.c b/Example/E02_uart_demo/libraries/zf_common/zf_common_fifo.c index b010d3e..94f5133 100644 --- a/Example/E02_uart_demo/libraries/zf_common/zf_common_fifo.c +++ b/Example/E02_uart_demo/libraries/zf_common/zf_common_fifo.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_fifo * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -45,7 +45,7 @@ // 使用示例 fifo_head_offset(fifo, 1); // 备注信息 本函数在文件内部调用 用户不用关注 也不可修改 //------------------------------------------------------------------------------------------------------------------- -static void fifo_head_offset (fifo_obj_struct *fifo, uint32 offset) +static void fifo_head_offset (fifo_struct *fifo, uint32 offset) { fifo->head += offset; @@ -63,7 +63,7 @@ static void fifo_head_offset (fifo_obj_struct *fifo, uint32 offset) // 使用示例 fifo_end_offset(fifo, 1); // 备注信息 本函数在文件内部调用 用户不用关注 也不可修改 //------------------------------------------------------------------------------------------------------------------- -static void fifo_end_offset (fifo_obj_struct *fifo, uint32 offset) +static void fifo_end_offset (fifo_struct *fifo, uint32 offset) { fifo->end += offset; @@ -80,7 +80,7 @@ static void fifo_end_offset (fifo_obj_struct *fifo, uint32 offset) // 使用示例 fifo_clear(fifo); // 备注信息 清空当前 FIFO 对象的内存 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_clear (fifo_obj_struct *fifo) +fifo_state_enum fifo_clear (fifo_struct *fifo) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -113,7 +113,7 @@ fifo_state_enum fifo_clear (fifo_obj_struct *fifo) // 使用示例 uint32 len = fifo_used(fifo); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 fifo_used (fifo_obj_struct *fifo) +uint32 fifo_used (fifo_struct *fifo) { zf_assert(fifo != NULL); return (fifo->max - fifo->size); // 返回当前 FIFO 缓冲区中数据个数 @@ -127,7 +127,7 @@ uint32 fifo_used (fifo_obj_struct *fifo) // 使用示例 zf_log(fifo_write_element(&fifo, data) == FIFO_SUCCESS, "fifo_write_byte error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat) +fifo_state_enum fifo_write_element (fifo_struct *fifo, uint32 dat) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -171,7 +171,7 @@ fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat) // 使用示例 zf_log(fifo_write_buffer(&fifo, data, 32) == FIFO_SUCCESS, "fifo_write_buffer error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 length) +fifo_state_enum fifo_write_buffer (fifo_struct *fifo, void *dat, uint32 length) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -286,7 +286,7 @@ fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 leng // 使用示例 zf_log(fifo_read_element(&fifo, data, FIFO_READ_ONLY) == FIFO_SUCCESS, "fifo_read_byte error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operation_enum flag) +fifo_state_enum fifo_read_element (fifo_struct *fifo, void *dat, fifo_operation_enum flag) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -348,7 +348,7 @@ fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operat // 使用示例 zf_log(fifo_read_buffer(&fifo, data, &length, FIFO_READ_ONLY) == FIFO_SUCCESS, "fifo_read_buffer error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) +fifo_state_enum fifo_read_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) { zf_assert(NULL != fifo); zf_assert(NULL != length); @@ -447,7 +447,7 @@ fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *leng // 如果使用 FIFO_READ_AND_CLEAN 操作 将会丢弃所有数据并清空整个 FIFO // 如果使用 FIFO_READ_AND_CLEAN 操作 将会丢弃所有数据并清空整个 FIFO //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) +fifo_state_enum fifo_read_tail_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) { zf_assert(NULL != fifo); zf_assert(NULL != length); @@ -541,7 +541,7 @@ fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 // 使用示例 fifo_init(&user_fifo, user_buffer, 64); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_init (fifo_obj_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size) +fifo_state_enum fifo_init (fifo_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; diff --git a/Example/E02_uart_demo/libraries/zf_common/zf_common_fifo.h b/Example/E02_uart_demo/libraries/zf_common/zf_common_fifo.h index 5cc7668..901a913 100644 --- a/Example/E02_uart_demo/libraries/zf_common/zf_common_fifo.h +++ b/Example/E02_uart_demo/libraries/zf_common/zf_common_fifo.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_fifo * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -91,17 +91,17 @@ typedef struct uint32 end; // 缓存尾指针 总是指向非空缓存(缓存全空除外) uint32 size; // 缓存剩余大小 uint32 max; // 缓存总大小 -}fifo_obj_struct; +}fifo_struct; -fifo_state_enum fifo_clear (fifo_obj_struct *fifo); -uint32 fifo_used (fifo_obj_struct *fifo); +fifo_state_enum fifo_clear (fifo_struct *fifo); +uint32 fifo_used (fifo_struct *fifo); -fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat); -fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 length); -fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operation_enum flag); -fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); -fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); +fifo_state_enum fifo_write_element (fifo_struct *fifo, uint32 dat); +fifo_state_enum fifo_write_buffer (fifo_struct *fifo, void *dat, uint32 length); +fifo_state_enum fifo_read_element (fifo_struct *fifo, void *dat, fifo_operation_enum flag); +fifo_state_enum fifo_read_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); +fifo_state_enum fifo_read_tail_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); -fifo_state_enum fifo_init (fifo_obj_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size); +fifo_state_enum fifo_init (fifo_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size); #endif diff --git a/Example/E02_uart_demo/libraries/zf_common/zf_common_font.c b/Example/E02_uart_demo/libraries/zf_common/zf_common_font.c index c816f9d..ee1df09 100644 --- a/Example/E02_uart_demo/libraries/zf_common/zf_common_font.c +++ b/Example/E02_uart_demo/libraries/zf_common/zf_common_font.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_font * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_common/zf_common_font.h b/Example/E02_uart_demo/libraries/zf_common/zf_common_font.h index 24b8602..7531250 100644 --- a/Example/E02_uart_demo/libraries/zf_common/zf_common_font.h +++ b/Example/E02_uart_demo/libraries/zf_common/zf_common_font.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_font * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_common/zf_common_function.c b/Example/E02_uart_demo/libraries/zf_common/zf_common_function.c index d403fb5..acf2739 100644 --- a/Example/E02_uart_demo/libraries/zf_common/zf_common_function.c +++ b/Example/E02_uart_demo/libraries/zf_common/zf_common_function.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_function * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_common/zf_common_function.h b/Example/E02_uart_demo/libraries/zf_common/zf_common_function.h index f5683e1..101b58a 100644 --- a/Example/E02_uart_demo/libraries/zf_common/zf_common_function.h +++ b/Example/E02_uart_demo/libraries/zf_common/zf_common_function.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_function * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_common/zf_common_headfile.h b/Example/E02_uart_demo/libraries/zf_common/zf_common_headfile.h index aa06ef8..86762db 100644 --- a/Example/E02_uart_demo/libraries/zf_common/zf_common_headfile.h +++ b/Example/E02_uart_demo/libraries/zf_common/zf_common_headfile.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_headfile * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -82,7 +82,7 @@ //===================================================外接设备驱动层=================================================== #include "zf_device_absolute_encoder.h" #include "zf_device_bluetooth_ch9141.h" -#include "zf_device_gps_tau1201.h" +#include "zf_device_gnss.h" #include "zf_device_camera.h" #include "zf_device_dl1a.h" #include "zf_device_dl1b.h" @@ -108,6 +108,7 @@ //====================================================应用组件层==================================================== #include "seekfree_assistant.h" +#include "seekfree_assistant_interface.h" //====================================================应用组件层==================================================== //=====================================================用户层====================================================== diff --git a/Example/E02_uart_demo/libraries/zf_common/zf_common_interrupt.c b/Example/E02_uart_demo/libraries/zf_common/zf_common_interrupt.c index 61058b2..af12fe0 100644 --- a/Example/E02_uart_demo/libraries/zf_common/zf_common_interrupt.c +++ b/Example/E02_uart_demo/libraries/zf_common/zf_common_interrupt.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_interrupt * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_common/zf_common_interrupt.h b/Example/E02_uart_demo/libraries/zf_common/zf_common_interrupt.h index 99b0e53..f828423 100644 --- a/Example/E02_uart_demo/libraries/zf_common/zf_common_interrupt.h +++ b/Example/E02_uart_demo/libraries/zf_common/zf_common_interrupt.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_interrupt * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_common/zf_common_typedef.h b/Example/E02_uart_demo/libraries/zf_common/zf_common_typedef.h index bd09f30..9a07c92 100644 --- a/Example/E02_uart_demo/libraries/zf_common/zf_common_typedef.h +++ b/Example/E02_uart_demo/libraries/zf_common/zf_common_typedef.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_typedef * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_components/seekfree_assistant.c b/Example/E02_uart_demo/libraries/zf_components/seekfree_assistant.c index a196e10..0b7cb9d 100644 --- a/Example/E02_uart_demo/libraries/zf_components/seekfree_assistant.c +++ b/Example/E02_uart_demo/libraries/zf_components/seekfree_assistant.c @@ -1,49 +1,71 @@ /********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ -#include "zf_common_fifo.h" + +#include "zf_common_debug.h" + #include "seekfree_assistant.h" -seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 -static seekfree_assistant_camera_struct seekfree_assistant_camera_data; // 图像上位机协议数据 -static seekfree_assistant_camera_dot_struct seekfree_assistant_camera_dot_data; // 图像上位机打点协议数据 -static seekfree_assistant_camera_buffer_struct seekfree_assistant_camera_buffer; // 图像以及边界缓冲区信息 -static fifo_obj_struct seekfree_assistant_fifo; -static uint8 seekfree_assistant_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE]; // 数据存放数组 -float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 保存接收到的参数 -vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 参数更新标志位 +extern uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length); +extern uint32 seekfree_assistant_receive (uint8 *buff, uint32 length); + +#if (1 == SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE) +#include "zf_common_fifo.h" +static uint8 seekfree_assistant_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE]; // FIFO缓冲区 +static fifo_struct seekfree_assistant_fifo = // FIFO结构体 +{ + .buffer = seekfree_assistant_buffer, + .execution = FIFO_IDLE, + .type = FIFO_DATA_8BIT, + .head = 0, + .end = 0, + .size = SEEKFREE_ASSISTANT_BUFFER_SIZE, + .max = SEEKFREE_ASSISTANT_BUFFER_SIZE, +}; +#endif + +static seekfree_assistant_camera_struct seekfree_assistant_camera_data; // 图像上位机协议数据 +static seekfree_assistant_camera_dot_struct seekfree_assistant_camera_dot_data; // 图像上位机打点协议数据 +static seekfree_assistant_camera_buffer_struct seekfree_assistant_camera_buffer; // 图像以及边界缓冲区信息 + +seekfree_assistant_transfer_callback_function seekfree_assistant_transfer_callback = seekfree_assistant_transfer; // 数据发送函数指针 +seekfree_assistant_receive_callback_function seekfree_assistant_receive_callback = seekfree_assistant_receive; // 数据接收函数指针 + +seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 +float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 保存接收到的参数 +vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 参数更新标志位 //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手求和函数 @@ -87,7 +109,7 @@ void seekfree_assistant_camera_data_send (seekfree_assistant_image_type_enum cam seekfree_assistant_camera_data.image_height = height; // 首先发送帧头、功能、摄像头类型、以及宽度高度等信息 - seekfree_assistant_transfer((const uint8 *)&seekfree_assistant_camera_data, sizeof(seekfree_assistant_camera_struct)); + seekfree_assistant_transfer_callback((const uint8 *)&seekfree_assistant_camera_data, sizeof(seekfree_assistant_camera_struct)); // 根据摄像头类型计算图像大小 switch(camera_type) @@ -111,9 +133,8 @@ void seekfree_assistant_camera_data_send (seekfree_assistant_image_type_enum cam // 发送图像数据 if(NULL != image_addr) { - seekfree_assistant_transfer(image_addr, image_size); + seekfree_assistant_transfer_callback(image_addr, image_size); } - } //------------------------------------------------------------------------------------------------------------------- @@ -139,16 +160,15 @@ void seekfree_assistant_camera_dot_send (seekfree_assistant_camera_buffer_struct dot_bytes *= 2; } - // 首先发送帧头、功能、边界编号、坐标长度、点个数 - seekfree_assistant_transfer((const uint8 *)&seekfree_assistant_camera_dot_data, sizeof(seekfree_assistant_camera_dot_struct)); + seekfree_assistant_transfer_callback((const uint8 *)&seekfree_assistant_camera_dot_data, sizeof(seekfree_assistant_camera_dot_struct)); for(i=0; i < SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY; i++) { // 判断是否发送横坐标数据 if(NULL != buffer->boundary_x[i]) { - seekfree_assistant_transfer((const uint8 *)buffer->boundary_x[i], dot_bytes); + seekfree_assistant_transfer_callback((const uint8 *)buffer->boundary_x[i], dot_bytes); } // 判断是否发送纵坐标数据 @@ -156,10 +176,9 @@ void seekfree_assistant_camera_dot_send (seekfree_assistant_camera_buffer_struct { // 如果没有纵坐标数据,则表示每一行只有一个边界 // 指定了横纵坐标数据,这种方式可以实现同一行多个边界的情况,例如搜线算法能够搜索出回弯。 - seekfree_assistant_transfer((const uint8 *)buffer->boundary_y[i], dot_bytes); + seekfree_assistant_transfer_callback((const uint8 *)buffer->boundary_y[i], dot_bytes); } } - } //------------------------------------------------------------------------------------------------------------------- @@ -193,7 +212,7 @@ void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struc // 数据在调用本函数之前,由用户将需要发送的数据写入seekfree_assistant_oscilloscope_data.data[] - seekfree_assistant_transfer((const uint8 *)seekfree_assistant_oscilloscope, packet_size); + seekfree_assistant_transfer_callback((const uint8 *)seekfree_assistant_oscilloscope, packet_size); } //------------------------------------------------------------------------------------------------------------------- @@ -364,12 +383,14 @@ void seekfree_assistant_camera_send (void) } } + //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手解析接收到的数据 // 参数说明 void // 返回参数 void // 使用示例 函数只需要放到周期运行的PIT中断或者主循环即可 //------------------------------------------------------------------------------------------------------------------- +#if (1 == SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE) void seekfree_assistant_data_analysis (void) { uint8 temp_sum; @@ -380,14 +401,13 @@ void seekfree_assistant_data_analysis (void) uint32 temp_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE / 4]; // 尝试读取数据, 如果不是自定义的传输方式则从接收回调中读取数据 - read_length = seekfree_assistant_receive((uint8 *)temp_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); + read_length = seekfree_assistant_receive_callback((uint8 *)temp_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); if(read_length) { // 将读取到的数据写入FIFO fifo_write_buffer(&seekfree_assistant_fifo, (uint8 *)temp_buffer, read_length); } - while(sizeof(seekfree_assistant_parameter_struct) <= fifo_used(&seekfree_assistant_fifo)) { read_length = sizeof(seekfree_assistant_parameter_struct); @@ -416,21 +436,11 @@ void seekfree_assistant_data_analysis (void) } } - // 丢弃无需使用的数据 fifo_read_buffer(&seekfree_assistant_fifo, (uint8 *)temp_buffer, &read_length, FIFO_READ_AND_CLEAN); } } - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 逐飞助手 初始化 -// 参数说明 -// 返回参数 void -// 使用示例 -//------------------------------------------------------------------------------------------------------------------- -ZF_WEAK void seekfree_assistant_init () -{ - fifo_init(&seekfree_assistant_fifo, FIFO_DATA_8BIT, seekfree_assistant_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); -} +#endif + diff --git a/Example/E02_uart_demo/libraries/zf_components/seekfree_assistant.h b/Example/E02_uart_demo/libraries/zf_components/seekfree_assistant.h index d02abb1..ae0f67c 100644 --- a/Example/E02_uart_demo/libraries/zf_components/seekfree_assistant.h +++ b/Example/E02_uart_demo/libraries/zf_components/seekfree_assistant.h @@ -1,69 +1,75 @@ -/*/********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +/********************************************************************************************************************* +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ #ifndef _seekfree_assistant_h_ #define _seekfree_assistant_h_ #include "zf_common_typedef.h" -#include "zf_common_debug.h" + + +// 1:使能参数调节的功能 0:关闭参数调节的功能 +#define SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE ( 1 ) + + // 定义接收FIFO大小 -#define SEEKFREE_ASSISTANT_BUFFER_SIZE ( 0x80 ) +#define SEEKFREE_ASSISTANT_BUFFER_SIZE ( 0x80 ) + +// 定义示波器的最大通道数量 +#define SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT ( 0x08 ) + +// 定义参数调试的最大通道数量 +#define SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT ( 0x08 ) + +// 定义图像边线最大数量 +#define SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY ( 0x08 ) + +// 单片机往上位机发送的帧头 +#define SEEKFREE_ASSISTANT_SEND_HEAD ( 0xAA ) + +// 摄像头类 +#define SEEKFREE_ASSISTANT_CAMERA_FUNCTION ( 0x02 ) +#define SEEKFREE_ASSISTANT_CAMERA_DOT_FUNCTION ( 0x03 ) +#define SEEKFREE_ASSISTANT_CAMERA_OSCILLOSCOPE ( 0x10 ) + +// 上位机往单片机发送的帧头 +#define SEEKFREE_ASSISTANT_RECEIVE_HEAD ( 0x55 ) + +// 参数设置类 +#define SEEKFREE_ASSISTANT_RECEIVE_SET_PARAMETER ( 0x20 ) -// 定义示波器的最大通道数量 -#define SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT ( 0x08 ) - -// 定义参数调试的最大通道数量 -#define SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT ( 0x08 ) - -// 定义图像边线最大数量 -#define SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY ( 0x08 ) - -// 单片机往上位机发送的帧头 -#define SEEKFREE_ASSISTANT_SEND_HEAD ( 0xAA ) - -// 摄像头类 -#define SEEKFREE_ASSISTANT_CAMERA_FUNCTION ( 0x02 ) -#define SEEKFREE_ASSISTANT_CAMERA_DOT_FUNCTION ( 0x03 ) -#define SEEKFREE_ASSISTANT_CAMERA_OSCILLOSCOPE ( 0x10 ) - -// 上位机往单片机发送的帧头 -#define SEEKFREE_ASSISTANT_RECEIVE_HEAD ( 0x55 ) - -// 参数设置类 -#define SEEKFREE_ASSISTANT_RECEIVE_SET_PARAMETER ( 0x20 ) // 摄像头类型枚举 typedef enum @@ -91,71 +97,69 @@ typedef enum typedef struct { - uint8 head; // 帧头 - uint8 channel_num; // 高四位为功能字 低四位为通道数量 - uint8 check_sum; // 和校验 - uint8 length; // 包长度 - float data[SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT]; // 通道数据 + uint8 head; // 帧头 + uint8 channel_num; // 高四位为功能字 低四位为通道数量 + uint8 check_sum; // 和校验 + uint8 length; // 包长度 + float data[SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT]; // 通道数据 }seekfree_assistant_oscilloscope_struct; typedef struct { - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 camera_type; // 低四位表示边界数量 第四位表示是否有图像数据 例如0x13:其中3表示一副图像有三条边界(通常是左边界、中线、右边界)、1表示没有图像数据 - uint8 length; // 包长度(仅包含协议部分) - uint16 image_width; // 图像宽度 - uint16 image_height; // 图像高度 -}seekfree_assistant_camera_struct; - - -typedef struct -{ - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 dot_type; // 点类型 BIT5:1:坐标是16位的 0:坐标是8位的 BIT7-BIT6:0:只有X坐标 1:只有Y坐标 2:X和Y坐标都有 BIT3-BIT0:边界数量 - uint8 length; // 包长度(仅包含协议部分) - uint16 dot_num; // 画点数量 - uint8 valid_flag; // 通道标识 - uint8 reserve; // 保留 -}seekfree_assistant_camera_dot_struct; - -typedef struct -{ - void *image_addr; // 摄像头地址 - uint16 width; // 图像宽度 - uint16 height; // 图像高度 - seekfree_assistant_image_type_enum camera_type; // 摄像头类型 - void *boundary_x[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界横坐标数组地址 - void *boundary_y[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界纵坐标数组地址 + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 camera_type; // 低四位表示边界数量 第四位表示是否有图像数据 例如0x13:其中3表示一副图像有三条边界(通常是左边界、中线、右边界)、1表示没有图像数据 + uint8 length; // 包长度(仅包含协议部分) + uint16 image_width; // 图像宽度 + uint16 image_height; // 图像高度 +}seekfree_assistant_camera_struct; + + +typedef struct +{ + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 dot_type; // 点类型 BIT5:1:坐标是16位的 0:坐标是8位的 BIT7-BIT6:0:只有X坐标 1:只有Y坐标 2:X和Y坐标都有 BIT3-BIT0:边界数量 + uint8 length; // 包长度(仅包含协议部分) + uint16 dot_num; // 画点数量 + uint8 valid_flag; // 通道标识 + uint8 reserve; // 保留 +}seekfree_assistant_camera_dot_struct; + +typedef struct +{ + void *image_addr; // 摄像头地址 + uint16 width; // 图像宽度 + uint16 height; // 图像高度 + seekfree_assistant_image_type_enum camera_type; // 摄像头类型 + void *boundary_x[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界横坐标数组地址 + void *boundary_y[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界纵坐标数组地址 }seekfree_assistant_camera_buffer_struct; typedef struct { - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 channel; // 通道 - uint8 check_sum; // 和校验 - float data; // 数据 + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 channel; // 通道 + uint8 check_sum; // 和校验 + float data; // 数据 }seekfree_assistant_parameter_struct; +typedef uint32 (*seekfree_assistant_transfer_callback_function) (const uint8 *buff, uint32 length); +typedef uint32 (*seekfree_assistant_receive_callback_function) (uint8 *buff, uint32 length); -extern seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 -extern float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 保存接收到的参数 -extern vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 参数更新标志位 +extern seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 +extern float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 保存接收到的参数 +extern vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 参数更新标志位 + + +void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struct *seekfree_assistant_oscilloscope); +void seekfree_assistant_camera_information_config (seekfree_assistant_image_type_enum camera_type, void *image_addr, uint16 width, uint16 height); +void seekfree_assistant_camera_boundary_config (seekfree_assistant_boundary_type_enum boundary_type, uint16 dot_num, void *dot_x1, void *dot_x2, void *dot_x3, void *dot_y1, void *dot_y2, void *dot_y3); +void seekfree_assistant_camera_send (void); +void seekfree_assistant_data_analysis (void); -uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length); -uint32 seekfree_assistant_receive (uint8 *buff, uint32 length); - -void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struct *seekfree_assistant_oscilloscope); - -void seekfree_assistant_camera_information_config (seekfree_assistant_image_type_enum camera_type, void *image_addr, uint16 width, uint16 height); -void seekfree_assistant_camera_boundary_config (seekfree_assistant_boundary_type_enum boundary_type, uint16 dot_num, void *dot_x1, void *dot_x2, void *dot_x3, void *dot_y1, void *dot_y2, void *dot_y3); -void seekfree_assistant_camera_send (void); - -void seekfree_assistant_data_analysis (void); -void seekfree_assistant_init (void); #endif diff --git a/Example/E02_uart_demo/libraries/zf_components/seekfree_assistant_interface.c b/Example/E02_uart_demo/libraries/zf_components/seekfree_assistant_interface.c index 99dbeef..fdade63 100644 --- a/Example/E02_uart_demo/libraries/zf_components/seekfree_assistant_interface.c +++ b/Example/E02_uart_demo/libraries/zf_components/seekfree_assistant_interface.c @@ -1,42 +1,55 @@ /********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant_interface * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ #include "zf_common_typedef.h" +#include "zf_common_fifo.h" #include "zf_common_debug.h" +#include "zf_driver_uart.h" +#include "zf_device_wireless_uart.h" +#include "zf_device_bluetooth_ch9141.h" +#include "zf_device_wifi_uart.h" +#include "zf_device_wifi_spi.h" #include "seekfree_assistant.h" +#include "seekfree_assistant_interface.h" + + +extern seekfree_assistant_transfer_callback_function seekfree_assistant_transfer_callback; // 数据发送函数指针 +extern seekfree_assistant_receive_callback_function seekfree_assistant_receive_callback; // 数据接收函数指针 + + //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手发送函数 // 参数说明 *buff 需要发送的数据地址 @@ -46,11 +59,9 @@ //------------------------------------------------------------------------------------------------------------------- ZF_WEAK uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length) { - uint32 len = 0; - - len = debug_send_buffer(buff, length); - - return len; + + // 当选择自定义通讯方式时 需要自行完成数据发送功能 + return length; } //------------------------------------------------------------------------------------------------------------------- @@ -62,11 +73,57 @@ ZF_WEAK uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length) //------------------------------------------------------------------------------------------------------------------- ZF_WEAK uint32 seekfree_assistant_receive (uint8 *buff, uint32 length) { - uint32 len = 0; + // 当选择自定义通讯方式时 需要自行完成数据接收功能 + return 0; +} - len = debug_read_ring_buffer(buff, length); - - return len; +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 逐飞助手接口 初始化 +// 参数说明 +// 返回参数 void +// 使用示例 seekfree_assistant_interface_init(SEEKFREE_ASSISTANT_WIFI_SPI); 使用高速WIFI SPI模块进行数据收发 +// 备注 需要自行调用设备的初始化,例如使用无线转串口进行数据的收发,则需要自行调用无线转串口的初始化,然后再调用seekfree_assistant_interface_init完成逐飞助手的接口初始化 +//------------------------------------------------------------------------------------------------------------------- +ZF_WEAK void seekfree_assistant_interface_init (seekfree_assistant_transfer_device_enum transfer_device) +{ + switch(transfer_device) + { + case SEEKFREE_ASSISTANT_DEBUG_UART: + { + seekfree_assistant_transfer_callback = debug_send_buffer; + seekfree_assistant_receive_callback = debug_read_ring_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIRELESS_UART: + { + seekfree_assistant_transfer_callback = wireless_uart_send_buffer; + seekfree_assistant_receive_callback = wireless_uart_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_CH9141: + { + seekfree_assistant_transfer_callback = bluetooth_ch9141_send_buffer; + seekfree_assistant_receive_callback = bluetooth_ch9141_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIFI_UART: + { + seekfree_assistant_transfer_callback = wifi_uart_send_buffer; + seekfree_assistant_receive_callback = wifi_uart_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIFI_SPI: + { + seekfree_assistant_transfer_callback = wifi_spi_send_buffer; + seekfree_assistant_receive_callback = wifi_spi_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_CUSTOM: + { + // 根据自己的需求 自行实现seekfree_assistant_transfer与seekfree_assistant_receive函数,完成数据的收发 + + }break; + } } diff --git a/Example/E02_uart_demo/libraries/zf_components/seekfree_assistant_interface.h b/Example/E02_uart_demo/libraries/zf_components/seekfree_assistant_interface.h new file mode 100644 index 0000000..940b5f7 --- /dev/null +++ b/Example/E02_uart_demo/libraries/zf_components/seekfree_assistant_interface.h @@ -0,0 +1,57 @@ +/********************************************************************************************************************* +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 +* Copyright (c) 2022 SEEKFREE 逐飞科技 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 +* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 +* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 +* +* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 +* 甚至没有隐含的适销性或适合特定用途的保证 +* 更多细节请参见 GPL +* +* 您应该在收到本开源库的同时收到一份 GPL 的副本 +* 如果没有,请参阅 +* +* 额外注明: +* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 +* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 +* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 +* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) +* +* 文件名称 seekfree_assistant_interface +* 公司名称 成都逐飞科技有限公司 +* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A +* 店铺链接 https://seekfree.taobao.com/ +* +* 修改记录 +* 日期 作者 备注 +* 2024-1-11 SeekFree first version +********************************************************************************************************************/ + +#ifndef _seekfree_assistant_interface_h_ +#define _seekfree_assistant_interface_h_ + + + +// 数据发送设备枚举 +typedef enum +{ + SEEKFREE_ASSISTANT_DEBUG_UART, // 调试串口 使用的串口由DEBUG_UART_INDEX宏定义指定 + SEEKFREE_ASSISTANT_WIRELESS_UART, // 无线转串口 + SEEKFREE_ASSISTANT_CH9141, // CH9141蓝牙 + SEEKFREE_ASSISTANT_WIFI_UART, // WIFI转串口 + SEEKFREE_ASSISTANT_WIFI_SPI, // 高速WIFI SPI + SEEKFREE_ASSISTANT_CUSTOM, // 自定义通讯方式 需要自行seekfree_assistant_transfer与seekfree_assistant_receive函数 +}seekfree_assistant_transfer_device_enum; + + +void seekfree_assistant_interface_init (seekfree_assistant_transfer_device_enum transfer_device); + + + +#endif diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_absolute_encoder.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_absolute_encoder.c index 7c80a3b..f9bc809 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_absolute_encoder.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_absolute_encoder.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_absolute_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_absolute_encoder.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_absolute_encoder.h index e6cc057..ed92906 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_absolute_encoder.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_absolute_encoder.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_absolute_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c index 500bccb..b0a06df 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_bluetooth_ch9141 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -54,7 +54,7 @@ #include "zf_device_camera.h" #include "zf_device_bluetooth_ch9141.h" -static fifo_obj_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 +static fifo_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 static uint8 bluetooth_ch9141_buffer[BLUETOOTH_CH9141_BUFFER_SIZE]; // 数据存放数组 static uint8 bluetooth_ch9141_data = 0; // 数据临时存放变量 diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h index 800be6c..ffb30b5 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h @@ -24,7 +24,7 @@ * 文件名称 main * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_camera.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_camera.c index 84c7aa0..68668c4 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_camera.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_camera.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_camera * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -45,7 +45,7 @@ #include "zf_device_camera.h" -fifo_obj_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 +fifo_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; // 定义摄像头接收数据缓冲区 uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // 定义摄像头数据发送到上位机的帧头 diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_camera.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_camera.h index 58efb06..2cd7d2d 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_camera.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_camera.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_camera * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -44,7 +44,7 @@ //=================================================摄像头公共库 基本配置================================================ #define CAMERA_RECEIVER_BUFFER_SIZE (8) // 定义摄像头接收数据缓冲区大小 -extern fifo_obj_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 +extern fifo_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 extern uint8 camera_send_image_frame_header[4]; // 声明摄像头数据发送到上位机的帧头 //=================================================摄像头公共库 基本配置================================================ diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_config.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_config.h index af6a3d8..6c8147d 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_config.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_config.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_config * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_dl1a.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_dl1a.c index 3e7410c..27be3a7 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_dl1a.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_dl1a.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1a * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_dl1a.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_dl1a.h index 89145d3..3176dd3 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_dl1a.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_dl1a.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1a * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_dl1b.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_dl1b.c index 90e64b3..96e472e 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_dl1b.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_dl1b.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1b * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_dl1b.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_dl1b.h index b144739..922b3ce 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_dl1b.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_dl1b.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1b * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_gps_tau1201.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_gnss.c similarity index 60% rename from Example/E03_adc_demo/libraries/zf_device/zf_device_gps_tau1201.c rename to Example/E02_uart_demo/libraries/zf_device/zf_device_gnss.c index da46a99..caf7cd0 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_gps_tau1201.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_gnss.c @@ -21,27 +21,26 @@ * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) * -* 文件名称 zf_device_gps_tau1201 +* 文件名称 zf_device_gnss * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * * 修改记录 -* 日期 作者 备注 -* 2022-09-15 pudding first version -* 2023-04-28 pudding 增加中文注释说明 +* 日期 作者 备注 +* 2023-12-28 pudding first version ********************************************************************************************************************/ -/******************************************************************************************************************** +/********************************************************************************************************************* * 接线定义: -* ------------------------------------ -* 模块管脚 单片机管脚 -* RX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_RX 宏定义 -* TX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_TX 宏定义 -* VCC 3.3V电源 -* GND 电源地 -* ------------------------------------ +* ------------------------------------ +* 模块管脚 单片机管脚 +* RX 查看 zf_device_gnss.h 中 GNSS_RX 宏定义 +* TX 查看 zf_device_gnss.h 中 GNSS_TX 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* ------------------------------------ ********************************************************************************************************************/ #include "math.h" @@ -50,22 +49,24 @@ #include "zf_driver_delay.h" #include "zf_driver_uart.h" -#include "zf_device_gps_tau1201.h" +#include "zf_device_gnss.h" -#define GPS_TAU1201_BUFFER_SIZE ( 128 ) +#define GNSS_BUFFER_SIZE ( 128 ) -uint8 gps_tau1201_flag = 0; // 1:采集完成等待处理数据 0:没有采集完成 -gps_info_struct gps_tau1201; // GPS解析之后的数据 +uint8 gnss_flag = 0; // 1:采集完成等待处理数据 0:没有采集完成 +gnss_info_struct gnss; // GPS解析之后的数据 + +static uint8 gnss_state = 0; // 1:GPS初始化完成 +static fifo_struct gnss_receiver_fifo; // +static uint8 gnss_receiver_buffer[GNSS_BUFFER_SIZE]; // 数据存放数组 -static uint8 gps_tau1201_state = 0; // 1:GPS初始化完成 -static fifo_obj_struct gps_tau1201_receiver_fifo; // -static uint8 gps_tau1201_receiver_buffer[GPS_TAU1201_BUFFER_SIZE]; // 数据存放数组 +static gps_state_enum gnss_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 +static gps_state_enum gnss_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 +static gps_state_enum gnss_ths_state = GPS_STATE_RECEIVING; // rmc 语句状态 -gps_state_enum gps_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 -gps_state_enum gps_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 - -static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; // GGA语句缓冲区 -static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; // RMC语句缓冲区 +static uint8 gps_gga_buffer[GNSS_BUFFER_SIZE]; +static uint8 gps_rmc_buffer[GNSS_BUFFER_SIZE]; +static uint8 gps_ths_buffer[GNSS_BUFFER_SIZE]; //------------------------------------------------------------------------------------------------------------------- // 函数简介 获取指定 ',' 后面的索引 @@ -94,7 +95,7 @@ static uint8 get_parameter_index (uint8 num, char *str) } if(j == num) { - len1 = i + 1; + len1 = i + 1; break; } } @@ -121,7 +122,7 @@ static int get_int_number (char *s) return_value = func_str_to_int(buf); return return_value; } - + //------------------------------------------------------------------------------------------------------------------- // 函数简介 给定字符串第一个 ',' 之前的数据转换为float // 参数说明 *s 字符串 @@ -134,15 +135,15 @@ static float get_float_number (char *s) uint8 i = 0; char buf[15]; float return_value = 0; - + i = get_parameter_index(1, s); i = i - 1; strncpy(buf, s, i); buf[i] = 0; return_value = (float)func_str_to_double(buf); - return return_value; + return return_value; } - + //------------------------------------------------------------------------------------------------------------------- // 函数简介 给定字符串第一个 ',' 之前的数据转换为double // 参数说明 *s 字符串 @@ -155,7 +156,7 @@ static double get_double_number (char *s) uint8 i = 0; char buf[15]; double return_value = 0; - + i = get_parameter_index(1, s); i = i - 1; strncpy(buf, s, i); @@ -168,13 +169,13 @@ static double get_double_number (char *s) // 函数简介 世界时间转换为北京时间 // 参数说明 *time 保存的时间 // 返回参数 void -// 使用示例 utc_to_btc(&gps->time); +// 使用示例 utc_to_btc(&gnss->time); // 备注信息 内部使用 //------------------------------------------------------------------------------------------------------------------- static void utc_to_btc (gps_time_struct *time) { uint8 day_num = 0; - + time->hour = time->hour + 8; if(23 < time->hour) { @@ -197,7 +198,7 @@ static void utc_to_btc (gps_time_struct *time) day_num = 30; } } - + if(time->day > day_num) { time->day = 1; @@ -214,18 +215,18 @@ static void utc_to_btc (gps_time_struct *time) //------------------------------------------------------------------------------------------------------------------- // 函数简介 RMC语句解析 // 参数说明 *line 接收到的语句信息 -// 参数说明 *gps 保存解析后的数据 +// 参数说明 *gnss 保存解析后的数据 // 返回参数 uint8 1:解析成功 0:数据有问题不能解析 -// 使用示例 gps_gnrmc_parse((char *)data_buffer, &gps_tau1201); +// 使用示例 gps_gnrmc_parse((char *)data_buffer, &gnss); // 备注信息 内部使用 //------------------------------------------------------------------------------------------------------------------- -static uint8 gps_gnrmc_parse (char *line, gps_info_struct *gps) +static uint8 gps_gnrmc_parse (char *line, gnss_info_struct *gnss) { uint8 state = 0, temp = 0; - + double latitude = 0; // 纬度 double longitude = 0; // 经度 - + double lati_cent_tmp = 0, lati_second_tmp = 0; double long_cent_tmp = 0, long_second_tmp = 0; float speed_tmp = 0; @@ -234,47 +235,50 @@ static uint8 gps_gnrmc_parse (char *line, gps_info_struct *gps) state = buf[get_parameter_index(2, buf)]; - gps->state = 0; if('A' == state) // 如果数据有效 则解析数据 { return_state = 1; - gps->state = 1; - gps -> ns = buf[get_parameter_index(4, buf)]; - gps -> ew = buf[get_parameter_index(6, buf)]; + gnss->state = 1; + gnss -> ns = buf[get_parameter_index(4, buf)]; + gnss -> 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; // 纬度转换为度分秒 - lati_cent_tmp = (latitude - gps->latitude_degree * 100); - gps->latitude_cent = (int)lati_cent_tmp; - lati_second_tmp = (lati_cent_tmp - gps->latitude_cent) * 6000; - gps->latitude_second = (int)lati_second_tmp; + gnss->latitude_degree = (int)latitude / 100; // 纬度转换为度分秒 + lati_cent_tmp = (latitude - gnss->latitude_degree * 100); + gnss->latitude_cent = (int)lati_cent_tmp; + lati_second_tmp = (lati_cent_tmp - gnss->latitude_cent) * 6000; + gnss->latitude_second = (int)lati_second_tmp; - gps->longitude_degree = (int)longitude / 100; // 经度转换为度分秒 - long_cent_tmp = (longitude - gps->longitude_degree * 100); - gps->longitude_cent = (int)long_cent_tmp; - long_second_tmp = (long_cent_tmp - gps->longitude_cent) * 6000; - gps->longitude_second = (int)long_second_tmp; + gnss->longitude_degree = (int)longitude / 100; // 经度转换为度分秒 + long_cent_tmp = (longitude - gnss->longitude_degree * 100); + gnss->longitude_cent = (int)long_cent_tmp; + long_second_tmp = (long_cent_tmp - gnss->longitude_cent) * 6000; + gnss->longitude_second = (int)long_second_tmp; - gps->latitude = gps->latitude_degree + lati_cent_tmp / 60; - gps->longitude = gps->longitude_degree + long_cent_tmp / 60; + gnss->latitude = gnss->latitude_degree + lati_cent_tmp / 60; + gnss->longitude = gnss->longitude_degree + long_cent_tmp / 60; speed_tmp = get_float_number(&buf[get_parameter_index(7, buf)]); // 速度(海里/小时) - gps->speed = speed_tmp * 1.85f; // 转换为公里/小时 - gps->direction = get_float_number(&buf[get_parameter_index(8, buf)]); // 角度 + gnss->speed = speed_tmp * 1.85f; // 转换为公里/小时 + gnss->direction = get_float_number(&buf[get_parameter_index(8, buf)]); // 角度 + } + else + { + gnss->state = 0; } // 在定位没有生效前也是有时间数据的,可以直接解析 - gps->time.hour = (buf[7] - '0') * 10 + (buf[8] - '0'); // 时间 - gps->time.minute = (buf[9] - '0') * 10 + (buf[10] - '0'); - gps->time.second = (buf[11] - '0') * 10 + (buf[12] - '0'); + gnss->time.hour = (buf[7] - '0') * 10 + (buf[8] - '0'); // 时间 + gnss->time.minute = (buf[9] - '0') * 10 + (buf[10] - '0'); + gnss->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'); // 日期 - 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; + gnss->time.day = (buf[temp + 0] - '0') * 10 + (buf[temp + 1] - '0'); // 日期 + gnss->time.month = (buf[temp + 2] - '0') * 10 + (buf[temp + 3] - '0'); + gnss->time.year = (buf[temp + 4] - '0') * 10 + (buf[temp + 5] - '0') + 2000; - utc_to_btc(&gps->time); + utc_to_btc(&gnss->time); return return_state; } @@ -282,12 +286,12 @@ static uint8 gps_gnrmc_parse (char *line, gps_info_struct *gps) //------------------------------------------------------------------------------------------------------------------- // 函数简介 GGA语句解析 // 参数说明 *line 接收到的语句信息 -// 参数说明 *gps 保存解析后的数据 +// 参数说明 *gnss 保存解析后的数据 // 返回参数 uint8 1:解析成功 0:数据有问题不能解析 -// 使用示例 gps_gngga_parse((char *)data_buffer, &gps_tau1201); +// 使用示例 gps_gngga_parse((char *)data_buffer, &gnss); // 备注信息 内部使用 //------------------------------------------------------------------------------------------------------------------- -static uint8 gps_gngga_parse (char *line, gps_info_struct *gps) +static uint8 gps_gngga_parse (char *line, gnss_info_struct *gnss) { uint8 state = 0; char *buf = line; @@ -297,11 +301,41 @@ static uint8 gps_gngga_parse (char *line, gps_info_struct *gps) 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)]); // 高度 = 海拔高度 + 地球椭球面相对大地水准面的高度 + gnss->satellite_used = (uint8)get_int_number(&buf[get_parameter_index(7, buf)]); + gnss->height = get_float_number(&buf[get_parameter_index(9, buf)]) + get_float_number(&buf[get_parameter_index(11, buf)]); // 高度 = 海拔高度 + 地球椭球面相对大地水准面的高度 return_state = 1; } + + return return_state; +} +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 THS语句解析 +// 参数说明 *line 接收到的语句信息 +// 参数说明 *gnss 保存解析后的数据 +// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 +// 使用示例 gps_gnths_parse((char *)data_buffer, &gnss); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 gps_gnths_parse (char *line, gnss_info_struct *gnss) +{ + uint8 state = 0; + char *buf = line; + uint8 return_state = 0; + + state = buf[get_parameter_index(2, buf)]; + + if('A' == state) + { + gnss->antenna_direction_state = 1; + gnss->antenna_direction = get_float_number(&buf[get_parameter_index(1, buf)]); + return_state = 1; + } + else + { + gnss->antenna_direction_state = 0; + } + return return_state; } @@ -316,7 +350,7 @@ static uint8 gps_gngga_parse (char *line, gps_info_struct *gps) // 备注信息 //------------------------------------------------------------------------------------------------------------------- double get_two_points_distance (double latitude1, double longitude1, double latitude2, double longitude2) -{ +{ const double EARTH_RADIUS = 6378137; // 地球半径(单位:m) double rad_latitude1 = 0; double rad_latitude2 = 0; @@ -325,7 +359,7 @@ double get_two_points_distance (double latitude1, double longitude1, double lati double distance = 0; double a = 0; double b = 0; - + rad_latitude1 = ANGLE_TO_RAD(latitude1); // 根据角度计算弧度 rad_latitude2 = ANGLE_TO_RAD(latitude2); rad_longitude1 = ANGLE_TO_RAD(longitude1); @@ -335,9 +369,9 @@ double get_two_points_distance (double latitude1, double longitude1, double lati 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 里面实现的算法 - distance = distance * EARTH_RADIUS; + distance = distance * EARTH_RADIUS; - return distance; + return distance; } //------------------------------------------------------------------------------------------------------------------- @@ -370,7 +404,7 @@ double get_two_points_azimuth (double latitude1, double longitude1, double latit // 使用示例 gps_data_parse(); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint8 gps_data_parse (void) +uint8 gnss_data_parse (void) { uint8 return_state = 0; uint8 check_buffer[5] = {'0', 'x', 0x00, 0x00, 0x00}; @@ -380,9 +414,9 @@ uint8 gps_data_parse (void) do { - if(GPS_STATE_RECEIVED == gps_rmc_state) + if(GPS_STATE_RECEIVED == gnss_rmc_state) { - gps_rmc_state = GPS_STATE_PARSING; + gnss_rmc_state = GPS_STATE_PARSING; strncpy((char *)&check_buffer[2], strchr((const char *)gps_rmc_buffer, '*') + 1, 2); bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); for(bbc_xor_calculation = gps_rmc_buffer[1], data_len = 2; '*' != gps_rmc_buffer[data_len]; data_len ++) @@ -395,17 +429,17 @@ uint8 gps_data_parse (void) return_state = 1; break; } - - gps_gnrmc_parse((char *)gps_rmc_buffer, &gps_tau1201); + + gps_gnrmc_parse((char *)gps_rmc_buffer, &gnss); } - gps_rmc_state = GPS_STATE_RECEIVING; - - if(GPS_STATE_RECEIVED == gps_gga_state) + gnss_rmc_state = GPS_STATE_RECEIVING; + + if(GPS_STATE_RECEIVED == gnss_gga_state) { - gps_gga_state = GPS_STATE_PARSING; + gnss_gga_state = GPS_STATE_PARSING; strncpy((char *)&check_buffer[2], strchr((const char *)gps_gga_buffer, '*') + 1, 2); bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); - + for(bbc_xor_calculation = gps_gga_buffer[1], data_len = 2; '*' != gps_gga_buffer[data_len]; data_len ++) { bbc_xor_calculation ^= gps_gga_buffer[data_len]; @@ -416,11 +450,32 @@ uint8 gps_data_parse (void) return_state = 1; break; } - - gps_gngga_parse((char *)gps_gga_buffer, &gps_tau1201); + + gps_gngga_parse((char *)gps_gga_buffer, &gnss); } - gps_gga_state = GPS_STATE_RECEIVING; - + gnss_gga_state = GPS_STATE_RECEIVING; + + if(GPS_STATE_RECEIVED == gnss_ths_state) + { + gnss_ths_state = GPS_STATE_PARSING; + strncpy((char *)&check_buffer[2], strchr((const char *)gps_ths_buffer, '*') + 1, 2); + bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); + + for(bbc_xor_calculation = gps_ths_buffer[1], data_len = 2; '*' != gps_ths_buffer[data_len]; data_len ++) + { + bbc_xor_calculation ^= gps_ths_buffer[data_len]; + } + if(bbc_xor_calculation != bbc_xor_origin) + { + // 数据校验失败 + return_state = 1; + break; + } + + gps_gnths_parse((char *)gps_ths_buffer, &gnss); + } + gnss_ths_state = GPS_STATE_RECEIVING; + }while(0); return return_state; } @@ -433,51 +488,64 @@ uint8 gps_data_parse (void) // 使用示例 gps_uart_callback(); // 备注信息 此函数需要在串口接收中断内进行调用 //------------------------------------------------------------------------------------------------------------------- -void gps_uart_callback (void) +void gnss_uart_callback (void) { uint8 temp_gps[6]; uint32 temp_length = 0; - if(gps_tau1201_state) + + + + if(gnss_state) { uint8 dat; - while(uart_query_byte(GPS_TAU1201_UART, &dat)) + while(uart_query_byte(GNSS_UART, &dat)) { - fifo_write_buffer(&gps_tau1201_receiver_fifo, &dat, 1); + fifo_write_buffer(&gnss_receiver_fifo, &dat, 1); } - + if('\n' == dat) { // 读取前6个数据 用于判断语句类型 temp_length = 6; - fifo_read_buffer(&gps_tau1201_receiver_fifo, temp_gps, &temp_length, FIFO_READ_ONLY); - + fifo_read_buffer(&gnss_receiver_fifo, temp_gps, &temp_length, FIFO_READ_ONLY); + // 根据不同类型将数据拷贝到不同的缓冲区 if(0 == strncmp((char *)&temp_gps[3], "RMC", 3)) { // 如果没有在解析数据则更新缓冲区的数据 - if(GPS_STATE_PARSING != gps_rmc_state) + if(GPS_STATE_PARSING != gnss_rmc_state) { - gps_rmc_state = GPS_STATE_RECEIVED; - temp_length = fifo_used(&gps_tau1201_receiver_fifo); - fifo_read_buffer(&gps_tau1201_receiver_fifo, gps_rmc_buffer, &temp_length, FIFO_READ_AND_CLEAN); + gnss_rmc_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_rmc_buffer, &temp_length, FIFO_READ_AND_CLEAN); } } else if(0 == strncmp((char *)&temp_gps[3], "GGA", 3)) { // 如果没有在解析数据则更新缓冲区的数据 - if(GPS_STATE_PARSING != gps_gga_state) + if(GPS_STATE_PARSING != gnss_gga_state) { - gps_gga_state = GPS_STATE_RECEIVED; - temp_length = fifo_used(&gps_tau1201_receiver_fifo); - fifo_read_buffer(&gps_tau1201_receiver_fifo, gps_gga_buffer, &temp_length, FIFO_READ_AND_CLEAN); + gnss_gga_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_gga_buffer, &temp_length, FIFO_READ_AND_CLEAN); } } - + else if(0 == strncmp((char *)&temp_gps[3], "THS", 3)) + { + // 如果没有在解析数据则更新缓冲区的数据 + if(GPS_STATE_PARSING != gnss_ths_state) + { + gnss_ths_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_ths_buffer, &temp_length, FIFO_READ_AND_CLEAN); + } + } + // 统一将FIFO清空 - fifo_clear(&gps_tau1201_receiver_fifo); + fifo_clear(&gnss_receiver_fifo); - gps_tau1201_flag = 1; + gnss_flag = 1; } } } @@ -489,12 +557,12 @@ void gps_uart_callback (void) // 使用示例 gps_init(); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -void gps_init (void) +void gnss_init (gps_device_enum gps_device) { 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}; @@ -504,38 +572,49 @@ void gps_init (void) 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}; + + if((TAU1201 == gps_device) || (GN42A == gps_device)) + { + fifo_init(&gnss_receiver_fifo, FIFO_DATA_8BIT, gnss_receiver_buffer, GNSS_BUFFER_SIZE); + system_delay_ms(500); // 等待GPS启动后开始初始化 + uart_init(GNSS_UART, 115200, GNSS_RX, GNSS_TX); - fifo_init(&gps_tau1201_receiver_fifo, FIFO_DATA_8BIT, gps_tau1201_receiver_buffer, GPS_TAU1201_BUFFER_SIZE); - system_delay_ms(500); // 等待GPS启动后开始初始化 - uart_init(GPS_TAU1201_UART, 115200, GPS_TAU1201_RX, GPS_TAU1201_TX); - uart_rx_interrupt(GPS_TAU1201_UART, 0); + uart_write_buffer(GNSS_UART, (uint8 *)set_rate, sizeof(set_rate)); // 设置GPS更新速率为10hz 如果不调用此语句则默认为1hz + system_delay_ms(200); + + uart_write_buffer(GNSS_UART, (uint8 *)open_rmc, sizeof(open_rmc)); // 开启rmc语句 + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)open_gga, sizeof(open_gga)); // 开启gga语句 + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gll, sizeof(close_gll)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gsa, sizeof(close_gsa)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_grs, sizeof(close_grs)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gsv, sizeof(close_gsv)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_vtg, sizeof(close_vtg)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_zda, sizeof(close_zda)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gst, sizeof(close_gst)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_txt, sizeof(close_txt)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_txt_ant, sizeof(close_txt_ant)); + system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)set_rate, sizeof(set_rate)); // 设置GPS更新速率为10hz 如果不调用此语句则默认为1hz - system_delay_ms(200); - - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)open_rmc, sizeof(open_rmc)); // 开启rmc语句 - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)open_gga, sizeof(open_gga)); // 开启gga语句 - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gll, sizeof(close_gll)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gsa, sizeof(close_gsa)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_grs, sizeof(close_grs)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gsv, sizeof(close_gsv)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_vtg, sizeof(close_vtg)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_zda, sizeof(close_zda)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gst, sizeof(close_gst)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_txt, sizeof(close_txt)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_txt_ant, sizeof(close_txt_ant)); - system_delay_ms(50); - - gps_tau1201_state = 1; - uart_rx_interrupt(GPS_TAU1201_UART, 1); + gnss_state = 1; + uart_rx_interrupt(GNSS_UART, 1); + } + else if(GN43RFA == gps_device) + { + // GN43RFA RTK模块不需要进行参数设置,如果需要修改参数应该使用专用的上位机修改参数 + fifo_init(&gnss_receiver_fifo, FIFO_DATA_8BIT, gnss_receiver_buffer, GNSS_BUFFER_SIZE); + uart_init(GNSS_UART, 115200, GNSS_RX, GNSS_TX); + gnss_state = 1; + uart_rx_interrupt(GNSS_UART, 1); + } + } diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_gnss.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_gnss.h new file mode 100644 index 0000000..5d58976 --- /dev/null +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_gnss.h @@ -0,0 +1,125 @@ +/********************************************************************************************************************* +* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* Copyright (c) 2022 SEEKFREE 逐飞科技 +* +* 本文件是 TC264 开源库的一部分 +* +* TC264 开源库 是免费软件 +* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 +* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 +* +* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 +* 甚至没有隐含的适销性或适合特定用途的保证 +* 更多细节请参见 GPL +* +* 您应该在收到本开源库的同时收到一份 GPL 的副本 +* 如果没有,请参阅 +* +* 额外注明: +* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 +* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 +* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 +* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) +* +* 文件名称 zf_device_gnss +* 公司名称 成都逐飞科技有限公司 +* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 +* 开发环境 ADS v1.9.20 +* 适用平台 TC264D +* 店铺链接 https://seekfree.taobao.com/ +* +* 修改记录 +* 日期 作者 备注 +* 2023-12-28 pudding first version +********************************************************************************************************************/ +/********************************************************************************************************************* +* 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* RX 查看 zf_device_gnss.h 中 GNSS_RX 宏定义 +* TX 查看 zf_device_gnss.h 中 GNSS_TX 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* ------------------------------------ +********************************************************************************************************************/ + +#ifndef _zf_device_gnss_h_ +#define _zf_device_gnss_h_ + +#include "zf_common_typedef.h" + +//-------------------------------------------------------------------------------------------------- +//引脚配置 +//-------------------------------------------------------------------------------------------------- +#define GNSS_UART (UART_3) +#define GNSS_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 +#define GNSS_TX (UART3_RX_P15_7) // GPS TX串口引脚 + +#define ANGLE_TO_RAD(x) ( (x) * PI / 180.0 ) // 角度转换为弧度 +#define RAD_TO_ANGLE(x) ( (x) * 180.0 / PI ) // 弧度转换为角度 +#define PI ( 3.1415926535898 ) + +typedef enum +{ + TAU1201 = 1, // 逐飞科技双频GPS模块 + GN42A = 1, // 逐飞科技双频GPS模块 与TAU1201是一样的 + GN43RFA = 2, // 逐飞科技三频RTK模块 +}gps_device_enum; + +typedef struct +{ + uint16 year; + uint8 month; + uint8 day; + uint8 hour; + uint8 minute; + uint8 second; +}gps_time_struct; + +typedef struct +{ + gps_time_struct time; // 时间 + + uint8 state; // 有效状态 1:定位有效 0:定位无效 + + uint16 latitude_degree; // 度 + uint16 latitude_cent; // 分 + uint16 latitude_second; // 秒 这里的秒是被放大了100倍的,主要是避免使用浮点数 + uint16 longitude_degree; // 度 + uint16 longitude_cent; // 分 + uint16 longitude_second; // 秒 这里的秒是被放大了100倍的,主要是避免使用浮点数 + + double latitude; // 纬度 + double longitude; // 经度 + + int8 ns; // 纬度半球 N(北半球)或 S(南半球) + int8 ew; // 经度半球 E(东经)或 W(西经) + + float speed; // 速度(公里/每小时) + float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准)+ + uint8 antenna_direction_state; // 双天线测向有效状态 1:测向有效 0:测向无效,无效时antenna_direction数据是无效的 + float antenna_direction; // 主天线指向从天线与真北构成的夹角(000.0~359.9 度) + + // 下面两个个信息从GNGGA语句中获取 + uint8 satellite_used; // 用于定位的卫星数量 + float height; // 高度 +}gnss_info_struct; + +typedef enum +{ + GPS_STATE_RECEIVING, // 正在接收数据 + GPS_STATE_RECEIVED, // 数据接收完成 + GPS_STATE_PARSING, // 正在解析 +}gps_state_enum; + +extern gnss_info_struct gnss; +extern uint8 gnss_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); +uint8 gnss_data_parse (void); +void gnss_uart_callback (void); +void gnss_init (gps_device_enum gps_device); + +#endif diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_gps_tau1201.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_gps_tau1201.h deleted file mode 100644 index c167bae..0000000 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_gps_tau1201.h +++ /dev/null @@ -1,117 +0,0 @@ -/********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 -* Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 -* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 -* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* -* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 -* 甚至没有隐含的适销性或适合特定用途的保证 -* 更多细节请参见 GPL -* -* 您应该在收到本开源库的同时收到一份 GPL 的副本 -* 如果没有,请参阅 -* -* 额外注明: -* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 -* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 -* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 -* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* -* 文件名称 zf_device_gps_tau1201 -* 公司名称 成都逐飞科技有限公司 -* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D -* 店铺链接 https://seekfree.taobao.com/ -* -* 修改记录 -* 日期 作者 备注 -* 2022-09-15 pudding first version -* 2023-04-28 pudding 增加中文注释说明 -********************************************************************************************************************/ -/******************************************************************************************************************** -* 接线定义: -* ------------------------------------ -* 模块管脚 单片机管脚 -* RX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_RX 宏定义 -* TX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_TX 宏定义 -* VCC 3.3V电源 -* GND 电源地 -* ------------------------------------ -********************************************************************************************************************/ - -#ifndef _zf_device_gps_tau1201_h_ -#define _zf_device_gps_tau1201_h_ - -#include "zf_common_typedef.h" - -//=================================================定义 定位模块 基本配置================================================ -#define GPS_TAU1201_UART (UART_3) -#define GPS_TAU1201_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 -#define GPS_TAU1201_TX (UART3_RX_P15_7) // GPS TX串口引脚 - -#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 -#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 -#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; // 时间- - uint8 state; // 有效状态 1:定位有效 0:定位无效 - uint16 latitude_degree; // 度 - uint16 latitude_cent; // 分 - uint16 latitude_second; // 秒 - uint16 longitude_degree; // 度 - uint16 longitude_cent; // 分 - uint16 longitude_second; // 秒 - double latitude; // 纬度 - double longitude; // 经度 - int8 ns; // 纬度半球 N(北半球)或 S(南半球) - int8 ew; // 经度半球 E(东经)或 W(西经) - float speed; // 速度(公里/每小时) - float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) - // 下面两个个信息从GNGGA语句中获取 - uint8 satellite_used; // 用于定位的卫星数量 - float height; // 高度 -}gps_info_struct; - -typedef enum -{ - GPS_STATE_RECEIVING, // 正在接收数据 - GPS_STATE_RECEIVED, // 数据接收完成 - GPS_STATE_PARSING, // 正在解析 -}gps_state_enum; -//================================================定义 定位模块 参数结构体================================================ - - -//=================================================声明 定位模块 全局变量================================================ -extern gps_info_struct gps_tau1201; // GPS解析之后的数据 -extern uint8 gps_tau1201_flag; // 1:采集完成等待处理数据 0:没有采集完成 -//=================================================声明 定位模块 全局变量================================================ - - -//=================================================声明 定位模块 基础函数================================================ -double get_two_points_distance (double lat1, double lng1, double lat2, double lng2); // 计算从第一个点到第二个点的距离(单位:m) -double get_two_points_azimuth (double lat1, double lon1, double lat2, double lon2); // 计算从第一个点到第二个点的方位角(单位:°) -uint8 gps_data_parse (void); // 解析GPS数据 -void gps_uart_callback (void); // GPS回调函数 -void gps_init (void); // GPS初始化 -//=================================================声明 定位模块 基础函数================================================ -#endif diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_icm20602.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_icm20602.c index f4ae830..ddebf3c 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_icm20602.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_icm20602.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_icm20602 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_icm20602.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_icm20602.h index 67724ad..209972b 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_icm20602.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_icm20602.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_icm20602 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_imu660ra.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_imu660ra.c index 95144f9..02fdb9e 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_imu660ra.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_imu660ra.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu660ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_imu660ra.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_imu660ra.h index a689df1..348e6a1 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_imu660ra.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_imu660ra.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu660ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_imu963ra.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_imu963ra.c index 92ec0f6..595142a 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_imu963ra.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_imu963ra.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu963ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_imu963ra.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_imu963ra.h index 4d0d9f9..c0f981f 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_imu963ra.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_imu963ra.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu963ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_ips114.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_ips114.c index 78c6f3b..b13e338 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_ips114.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_ips114.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips114 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_ips114.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_ips114.h index 81dfc3c..ba932b1 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_ips114.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_ips114.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips114 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_ips200.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_ips200.c index cd8681f..37d9d04 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_ips200.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_ips200.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips200 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_ips200.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_ips200.h index ce59927..045bf27 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_ips200.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_ips200.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips200 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_key.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_key.c index 9e42c8a..8b240cb 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_key.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_key.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_key * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_key.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_key.h index bcab8aa..9c653cf 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_key.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_key.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_key * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_mpu6050.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_mpu6050.c index dc3c5b2..101a5ae 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_mpu6050.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_mpu6050.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_mpu6050 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_mpu6050.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_mpu6050.h index 3510e06..c8a086f 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_mpu6050.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_mpu6050.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_mpu6050 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_mt9v03x.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_mt9v03x.c index 231cfec..d38b8df 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_mt9v03x.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_mt9v03x.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_mt9v03x * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_mt9v03x.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_mt9v03x.h index 7786bc5..9d4650d 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_mt9v03x.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_mt9v03x.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_mt9v03x * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_oled.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_oled.c index 5314209..55aefa7 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_oled.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_oled.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_oled * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_oled.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_oled.h index d52d2fd..aadf048 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_oled.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_oled.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_oled * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_ov7725.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_ov7725.c index 12f6095..bac95fe 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_ov7725.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_ov7725.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ov7725 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_ov7725.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_ov7725.h index f45a4e8..2cb4026 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_ov7725.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_ov7725.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ov7725 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_scc8660.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_scc8660.c index 3483c93..38d65ff 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_scc8660.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_scc8660.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_scc8660 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_scc8660.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_scc8660.h index 815d272..537283a 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_scc8660.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_scc8660.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_scc8660 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_tft180.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_tft180.c index db50824..b661e91 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_tft180.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_tft180.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_tft180 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_tft180.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_tft180.h index 47491ee..54a72b3 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_tft180.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_tft180.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_tft180 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_tsl1401.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_tsl1401.c index 3f9db7f..d133c7c 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_tsl1401.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_tsl1401.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_tsl1401 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_tsl1401.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_tsl1401.h index 1fab12e..a7b061c 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_tsl1401.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_tsl1401.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_tsl1401 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_type.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_type.c index 497ba55..af24701 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_type.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_type.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_type * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -32,6 +32,7 @@ * 日期 作者 备注 * 2022-09-15 pudding first version * 2023-05-26 pudding 新增SPI WIFI 中断回调指针 +* 2024-01-16 pudding 移除SPI WIFI 中断回调指针 SPI WIFI将不再使用外部 ********************************************************************************************************************/ #include "zf_device_type.h" @@ -45,7 +46,6 @@ callback_function camera_dma_handler = type_default_callback; wireless_type_enum wireless_type = NO_WIRELESS; callback_function wireless_module_uart_handler = type_default_callback; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 -callback_function wireless_module_spi_handler = type_default_callback; // WIFI SPI GPIO中断函数指针,根据初始化时设置的函数进行跳转 tof_type_enum tof_type = NO_TOF; callback_function tof_module_exti_handler = type_default_callback; // ToF 模块 INT 更新中断 @@ -54,7 +54,7 @@ callback_function tof_module_exti_handler = type_default_callback; // 函数简介 默认回调函数 // 参数说明 void // 返回参数 void -// 使用示例 +// 使用示例 // 备注信息 保护性冗余设计 防止在没有初始化设备的时候跑飞 //------------------------------------------------------------------------------------------------------------------- static void type_default_callback (void) @@ -90,14 +90,7 @@ void set_camera_type (camera_type_enum type_set, callback_function vsync_callba void set_wireless_type (wireless_type_enum type_set, callback_function wireless_callback) { wireless_type = type_set; - if(WIFI_SPI == wireless_type) - { - wireless_module_spi_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); - } - else - { - wireless_module_uart_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); - } + wireless_module_uart_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); } //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_type.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_type.h index 19c36ca..3b124fe 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_type.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_type.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_type * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -56,7 +56,6 @@ typedef enum WIRELESS_UART, // 无线串口 BLUETOOTH_CH9141, // 蓝牙 CH9141 WIFI_UART, // 串口 WiFi - WIFI_SPI // SPI WiFi }wireless_type_enum; typedef enum diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c index 2bdb164..3cbc786 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_virtual_oscilloscope * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h index f518026..b0fd085 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_virtual_oscilloscope * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_wifi_spi.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_wifi_spi.c index 78a6d68..f9e51ca 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_wifi_spi.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_wifi_spi.c @@ -24,14 +24,13 @@ * 文件名称 zf_device_wifi_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 * 日期 作者 备注 -* 2023-05-27 pudding first version -* 2023-05-29 pudding 新增关闭休眠指令,提升通讯效率 +* 2022-09-21 SeekFree first version ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,1374 +52,615 @@ #include "zf_common_clock.h" #include "zf_common_debug.h" #include "zf_common_fifo.h" -#include "zf_common_function.h" #include "zf_driver_delay.h" #include "zf_driver_gpio.h" -#include "zf_common_interrupt.h" -#include "zf_driver_exti.h" #include "zf_driver_spi.h" #include "zf_device_type.h" #include "zf_device_wifi_spi.h" -#define WAIT_TIME_OUT (10000) // 单指令等待时间 单位:ms +#define WIFI_CONNECT_TIME_OUT 10000 // 单位毫秒 +#define SOCKET_CONNECT_TIME_OUT 50000 // 单位毫秒 +#define OTHER_TIME_OUT 1000 // 单位毫秒 -#define WIFI_SPI_WRITE_MAX 128 // 定义一次SPI通讯最大发送的数据长度 - -#define WIFI_SPI_WRITE_REQUEST 0x01 -#define WIFI_SPI_CHECK_STATE 0x02 -#define WIFI_SPI_WRITE_DATA 0x03 -#define WIFI_SPI_READ_DATA 0x04 -#define WIFI_SPI_WRITE_END 0x07 -#define WIFI_SPI_READ_END 0x08 - -#define WIFI_SPI_WRITE_ADDR 0x00 -#define WIFI_SPI_STATE_ADDR 0x04 +char wifi_spi_version[12]; // 保存模块固件版本信息 +char wifi_spi_mac_addr[20]; // 保存模块MAC地址信息 +char wifi_spi_ip_addr_port[25]; // 保存模块IP地址与端口信息 -volatile wifi_spi_buffer_state_enum wifi_buffer_state; -volatile wifi_spi_transmit_state_enum wifi_transmit_state; - -static fifo_obj_struct wifi_spi_fifo; -static uint8 wifi_spi_buffer[WIFI_SPI_BUFFER_SIZE]; // 数据存放数组 - -vuint8 wifi_spi_ack_flag = 0; // 0:模块未应答 1:模块已应答 -uint8 wifi_spi_init_flag; // 0:模块未初始化成功或者未连接 1:模块已连接并成功初始化 -vuint8 wifi_spi_packet_num; // 发送的数据包ID -vuint32 wifi_spi_send_remain_length; // 剩余的发送长度 - - - -wifi_spi_information_struct wifi_spi_information; +static fifo_struct wifi_spi_fifo; +static uint8 wifi_spi_buffer[WIFI_SPI_RECVIVE_FIFO_SIZE]; +static volatile wifi_spi_state_enum wifi_spi_mutex; //------------------------------------------------------------------------------------------------------------------- -// 函数简介 请求写入数据到模块 -// 参数说明 length 需要写入的长度 -// @return void -// Sample usage: +// 函数简介 等待WIFI SPI就绪 +// 参数说明 wait_time 最大等待时间 单位毫秒 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_write_request(uint16 length) +static uint8 wifi_spi_wait_idle (uint32 wait_time) { - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_REQUEST; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - head.magic = 0xFE; - head.sequence = wifi_spi_packet_num++; - head.length = length; + uint32 time = 0; - wifi_transmit_state = TRANSMIT_WRITE_REQUEST; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 7); - gpio_set_level(WIFI_SPI_CS_PIN, 1); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 读取模块状态 -// 参数说明 *length 需要读取或者写入的长度 -// @return WIFI_SPI_BUFFER_STATE_enum 模块状态 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static wifi_spi_buffer_state_enum wifi_spi_read_state(uint16 *length) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_CHECK_STATE; - head.addr = WIFI_SPI_STATE_ADDR; - head.dummy = 0x00; - - wifi_spi_ack_flag = 0; - wifi_transmit_state = TRANSMIT_READ_STATE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_transfer_8bit(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, &head.cmd, 7); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - - if(BUFFER_WRITE == head.magic) + wait_time = wait_time*100; + while(0 == gpio_get_level(WIFI_SPI_INT_PIN)) { - wifi_spi_packet_num = head.sequence; - } - *length = head.length; - - return (wifi_spi_buffer_state_enum)head.magic; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据发送完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_done(void) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_END; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_transmit_state = TRANSMIT_IDLE; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据接收完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_start(void) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_READ_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - wifi_transmit_state = TRANSMIT_READ; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据接收完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_done(void) -{ - wifi_spi_buffer_struct head; - - gpio_set_level(WIFI_SPI_CS_PIN, 1); - - head.cmd = WIFI_SPI_READ_END; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_transmit_state = TRANSMIT_IDLE; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块 -// 参数说明 *buff 需要写入数据的首地址 -// 参数说明 length 需要写入数据的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_data(const uint8 *buff, uint16 length) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - wifi_transmit_state = TRANSMIT_WRITE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - spi_write_8bit_array(WIFI_SPI_INDEX, buff, length); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_spi_send_done(); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_data_multi(wifi_spi_send_multi_struct *multi_buffer) -{ - uint8 i; - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - wifi_transmit_state = TRANSMIT_WRITE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - - for(i = 0; i < WIFI_SPI_MAX_MULTI; i++) - { - if(NULL != multi_buffer->source[i]) spi_write_8bit_array(WIFI_SPI_INDEX, multi_buffer->source[i], multi_buffer->length[i]); - } - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_spi_send_done(); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 接收模块发送的数据 -// 参数说明 *buff 接收数组的缓冲区首地址 -// 参数说明 length 需要接收的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_data(uint8 *buff, uint16 length) -{ - spi_read_8bit_array(WIFI_SPI_INDEX, buff, length); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送命令到模块 -// 参数说明 *str 命令字符串首地址 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_command(const char *str) -{ - uint8 state = 0; - uint16 send_length; - uint16 wait_time = 0; - - // 请求发送数据 - send_length = (uint16)strlen(str); - - // 等待传输进入空闲 - while(TRANSMIT_IDLE != wifi_transmit_state); - - // 如果没有进入发送状态则重新请求发送数据 - while(BUFFER_WRITE != wifi_buffer_state) - { - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - while(!wifi_spi_ack_flag) - { - wait_time++; - if((WAIT_TIME_OUT / 4) <= wait_time) - { - state = 1; - wifi_spi_init_flag = 0; // 模块已断开 - break; - } - system_delay_ms(1); - } - - if(1 == state) + system_delay_us(10); + time++; + if(wait_time <= time) { break; } } - - wifi_buffer_state = BUFFER_IDLE; - - if(0 == state) // 通讯未超时 - { - wifi_spi_send_remain_length = send_length; - // 发送消息 - wifi_spi_send_data((const uint8 *)str, send_length); - } + return (wait_time <= time); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 检查模块状态并读取模块发送的数据 -// 参数说明 void -// @return void -// Sample usage: +// 函数简介 写入数据到WIFI SPI +// 参数说明 *buffer1 第一组需要发送的数据缓冲区地址 +// 参数说明 length1 第一组数据长度 +// 参数说明 *buffer2 第二组需要发送的数据缓冲区地址 +// 参数说明 length2 第二组数据长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -void wifi_spi_check_state_read_buffer(void) +static void wifi_spi_write (const uint8 *buffer1, uint16 length1, const uint8 *buffer2, uint16 length2) { - uint16 wifi_spi_receive_length; // 本次接收到的数据数量 - uint8 wifi_spi_receive_buffer[WIFI_SPI_WRITE_MAX]; - - // 查询WIFI模块的状态 - wifi_buffer_state = wifi_spi_read_state(&wifi_spi_receive_length); - - // 如果需要读取WIFI模块数据,则保存需要读取的长度 - if(BUFFER_READ == wifi_buffer_state) + gpio_low(WIFI_SPI_CS_PIN); + if(NULL != buffer1) { - wifi_spi_receive_start(); - do - { - if(wifi_spi_receive_length > WIFI_SPI_WRITE_MAX) - { - wifi_spi_receive_data((uint8 *)wifi_spi_receive_buffer, WIFI_SPI_WRITE_MAX); - fifo_write_buffer(&wifi_spi_fifo, wifi_spi_receive_buffer, WIFI_SPI_WRITE_MAX); // 存入 FIFO - wifi_spi_receive_length = wifi_spi_receive_length - WIFI_SPI_WRITE_MAX; - } - else - { - wifi_spi_receive_data((uint8 *)wifi_spi_receive_buffer, wifi_spi_receive_length); - fifo_write_buffer(&wifi_spi_fifo, wifi_spi_receive_buffer, wifi_spi_receive_length); // 存入 FIFO - wifi_spi_receive_length = 0; - } - }while(wifi_spi_receive_length > 0); - wifi_spi_receive_done(); + spi_write_8bit_array(WIFI_SPI_INDEX, buffer1, length1); } - else if(BUFFER_IDLE == wifi_buffer_state) + if(NULL != buffer2) { - // 如果模块内部缓冲区状态为空闲,则传输状态也设置为空闲 - wifi_transmit_state = TRANSMIT_IDLE; + spi_write_8bit_array(WIFI_SPI_INDEX, buffer2, length2); } + gpio_high(WIFI_SPI_CS_PIN); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块 -// 参数说明 *buff 需要发送的数据首地址 -// 参数说明 length 需要发送的长度 -// @return uint32 剩余未发送长度 -// Sample usage: +// 函数简介 WIFI SPI 发送与接收同时进行(命令收发) +// 参数说明 *packets 发送与接收的地址 +// 参数说明 length 需要接收的长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_write_data(const uint8 *buff, uint32 length) +static void wifi_spi_transfer_command (wifi_spi_packets_struct *packets, uint16 length) { - uint16 send_length; - uint32 wait_time; + gpio_low(WIFI_SPI_CS_PIN); - // 记录需要发送的长度 - wifi_spi_send_remain_length = length; - - while(wifi_spi_send_remain_length) + spi_transfer_8bit(WIFI_SPI_INDEX, (uint8 *)&(packets->head), (uint8 *)&(packets->head), sizeof(wifi_spi_head_struct)); + + if(length) { - send_length = (uint16)func_limit_ab(wifi_spi_send_remain_length, 1, WIFI_SPI_WRITE_MAX); - - // 请求发送数据 - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - - // 最长等待5秒 - wait_time = 5000; - while(!wifi_spi_ack_flag) - { - wait_time--; - if(0 == wait_time) break; - system_delay_ms(1); - } - - if(BUFFER_WRITE == wifi_buffer_state) - { - // 发送消息 - wifi_spi_send_data(buff, send_length); - buff += send_length; - wifi_spi_send_remain_length -= send_length; - wifi_buffer_state = BUFFER_IDLE; - } - else - { - break; - } + spi_transfer_8bit(WIFI_SPI_INDEX, (const uint8 *)(packets->buffer), packets->buffer, length); } - - return wifi_spi_send_remain_length; + + gpio_high(WIFI_SPI_CS_PIN); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// @return uint32 剩余未发送长度 -// Sample usage: 发送数据总长度不能超过4092个 +// 函数简介 WIFI SPI 发送与接收同时进行(数据收发) +// 参数说明 *write_data 发送的数据缓冲区地址 +// 参数说明 *read_data 接收到的数据的存储地址 +// 参数说明 length 需要接收的长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_write_data_multi(wifi_spi_send_multi_struct *multi_buffer) +static void wifi_spi_transfer_data (const uint8 *write_data, wifi_spi_packets_struct *read_data, uint16 length) { - uint16 send_length; - uint32 wait_time; + gpio_low(WIFI_SPI_CS_PIN); - // 记录需要发送的长度 - send_length = multi_buffer->length[0] + multi_buffer->length[1] + multi_buffer->length[2] + multi_buffer->length[3] + multi_buffer->length[4] + multi_buffer->length[5] + multi_buffer->length[6] + multi_buffer->length[7]; + read_data->head.command = WIFI_SPI_DATA; + read_data->head.length = length; - if(WIFI_SPI_WRITE_MAX >= send_length) + spi_transfer_8bit(WIFI_SPI_INDEX, (uint8 *)&(read_data->head), (uint8 *)&(read_data->head), sizeof(wifi_spi_head_struct)); + + if(WIFI_SPI_RECVIVE_SIZE < length) { - // 请求发送数据 - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - - // 最长等待5秒 - wait_time = 5000; - while(!wifi_spi_ack_flag) - { - wait_time--; - if(0 == wait_time) break; - system_delay_ms(1); - } - - if(BUFFER_WRITE == wifi_buffer_state) - { - // 发送消息 - wifi_spi_send_data_multi(multi_buffer); - send_length = 0; - wifi_buffer_state = BUFFER_IDLE; - } + spi_transfer_8bit(WIFI_SPI_INDEX, write_data, read_data->buffer, WIFI_SPI_RECVIVE_SIZE); + spi_write_8bit_array(WIFI_SPI_INDEX, &write_data[WIFI_SPI_RECVIVE_SIZE], length - WIFI_SPI_RECVIVE_SIZE); } - - return send_length; + else + { + // 将需要发送的数据拷贝到读取缓冲区,避免出现write_data越界访问 + memcpy(read_data->buffer, write_data, length); + spi_transfer_8bit(WIFI_SPI_INDEX, read_data->buffer, read_data->buffer, WIFI_SPI_RECVIVE_SIZE); + } + gpio_high(WIFI_SPI_CS_PIN); } -//-------------------------------------------------------------------------------------------------- -// 函数简介 等待模块响应 -// 参数说明 *wait_buffer 等待的响应的字符串 -// 参数说明 timeout 超时时间 -// 返回参数 uint8 0:模块响应指定数据 1:模块未响应指定数据或超时 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_wait_ack (char *wait_buffer, uint32 timeout) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 参数设置 +// 参数说明 command 命令类型 +// 参数说明 *buffer 参数地址 +// 参数说明 length 参数长度 +// 参数说明 wait_time 最大等待时间 单位100微妙 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_set_parameter (wifi_spi_packets_command_enum command, uint8 *buffer, uint16 length, uint32 wait_time) { - uint8 return_state = 1; - char receiver_buffer[8] = {0, 0, 0, 0, 0, 0, 0, 0}; - uint32 receiver_len = 8; - + uint8 return_state; + wifi_spi_head_struct head; + return_state = 1; do { - system_delay_ms(1); - // 判断接收缓冲区内是否有需要响应的指定数据 如果有 则跳出循环并且返回0 - receiver_len = 8; - fifo_read_tail_buffer(&wifi_spi_fifo, (uint8 *)receiver_buffer, &receiver_len, FIFO_READ_ONLY); + head.command = command; + head.length = length; + + // 等待从机准备就绪 + if(wifi_spi_wait_idle(wait_time)) + { + break; + } - if(strstr(receiver_buffer, wait_buffer)) + wifi_spi_write(&head.command, sizeof(wifi_spi_head_struct), buffer, length); + if(wifi_spi_wait_idle(wait_time)) + { + break; + } + // 接收应答信号 + + head.command = WIFI_SPI_DATA; + head.length = 0; + wifi_spi_transfer_command((wifi_spi_packets_struct *)&head, head.length); + system_delay_us(20); + if(WIFI_SPI_REPLY_OK == head.command) { return_state = 0; - break; } - else if(strstr(receiver_buffer, "ERROR") || strstr(receiver_buffer, "busy")) - { - // 如果接收到报错或者模块忙 则跳出循环并且返回1 - return_state = 1; - break; - } - }while(timeout --); + }while(0); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 清除WiFi接收缓冲区内容 -// 参数说明 void -// 返回参数 void -// 使用示例 wifi_spi_clear_receive_buffer(); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static void wifi_spi_clear_receive_buffer (void) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 模块信息获取 +// 参数说明 command 命令类型 +// 参数说明 *buffer 保存接收到的参数地址 +// 参数说明 wait_time 最大等待时间 单位100微妙 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_parameter (wifi_spi_packets_command_enum command, wifi_spi_packets_struct *read_data, uint32 wait_time) { - // 清空WiFi接收缓冲区 - fifo_clear(&wifi_spi_fifo); -} + uint8 return_state; -//-------------------------------------------------------------------------------------------------- -// 函数简介 模块数据解析 -// 参数说明 *target_buffer 目标存放地址指针 字符串数组 -// 参数说明 *origin_buffer 数据来源地址指针 字符串数组 -// 参数说明 start_char 起始提取字节 例如从 "1234" 中从 '2' 开始提取 就应该填入 '2' -// 参数说明 end_char 结束提取字节 例如从 "1234" 中在 '4' 结束提取 就应该填入 '\0'(0x00 空字符 一般是字符串结尾) -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_data_parse(wifi_spi_information.mac, wifi_spi_receive_buffer, '"', '"'); // 调用获取本机mac地址后,调用此函数提取mac地址 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char start_char, char end_char) -{ - uint8 return_state = 0; - char *location1; - char *location2; - location1 = strchr((char *)origin_buffer, start_char); - if(location1) + return_state = 1; + do { - location1 ++; - location2 = strchr(location1, end_char); - if(location2) + // 等待从机准备就绪 + if(wifi_spi_wait_idle(wait_time)) { - memcpy(target_buffer, location1, location2-location1); + break; } - else + read_data->head.command = command; + wifi_spi_write(&(read_data->head.command), WIFI_SPI_RECVIVE_SIZE, NULL, 0); + + if(wifi_spi_wait_idle(wait_time)) { - return_state = 1; + break; } - } - else - { - return_state = 1; - } + read_data->head.command = WIFI_SPI_DATA; + read_data->head.length = 0; + wifi_spi_transfer_command(read_data, WIFI_SPI_RECVIVE_SIZE); + return_state = 0; + }while(0); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 查看模块版本信息 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_get_version(); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 固件版本获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,固件版本信息以字符串形式保存在wifi_spi_version数组中 +//------------------------------------------------------------------------------------------------------------------- static uint8 wifi_spi_get_version (void) { - char *location1; - uint8 return_state = 0; - uint8 receiver_buffer[256]; - uint32 receiver_len = 256; + uint8 return_state; + wifi_spi_packets_struct temp_packets; - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+GMR\r\n"); - do + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_VERSION, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_VERSION == temp_packets.head.command)) { - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - location1 = strrchr((char *)receiver_buffer, ':'); - if(wifi_spi_data_parse(wifi_spi_information.version, (uint8 *)location1, ':', '(')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - + memcpy(wifi_spi_version, temp_packets.buffer, temp_packets.head.length); + } return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 模块回显设置 -// 参数说明 model 0:关闭模块的回写功能 其他:开启模块回写 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_echo_set("1");//开启模块回写功能 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_echo_set (char *model) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI MAC地址获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,MAC地址信息以字符串形式保存在wifi_spi_mac_addr数组中 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_mac_addr (void) { - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - if('1' == *model) + uint8 return_state; + wifi_spi_packets_struct temp_packets; + + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_MAC_ADDR, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_MAC_ADDR == temp_packets.head.command)) { - wifi_spi_send_command("ATE1\r\n"); + memcpy(wifi_spi_mac_addr, temp_packets.buffer, temp_packets.head.length); + } + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI IP地址与端口号获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 +// 需要在连接Socket之后调用此函数才能正常获取信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_ip_addr_port (void) +{ + uint8 return_state; + wifi_spi_packets_struct temp_packets; + + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_IP_ADDR, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_IP_ADDR == temp_packets.head.command)) + { + memcpy(wifi_spi_ip_addr_port, temp_packets.buffer, temp_packets.head.length); + } + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 设置连接的WiFi信息并尝试连接WiFi +// 参数说明 *wifi_ssid WIFI名称 +// 参数说明 *pass_word WIFI密码 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_wifi_connect("SEEKFREE", "SEEKFREE123"); +// 备注信息 wifi_spi_wifi_connect("SEEKFREE", NULL); // 连接没有密码的WIFI热点 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_wifi_connect (char *wifi_ssid, char *pass_word) +{ + uint8 return_state; + uint8 temp_buffer[64]; + uint16 length; + + if(NULL != pass_word) + { + // WIFI热点有密码发送热点名称与密码 + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n%s\r\n", wifi_ssid, pass_word); } else { - wifi_spi_send_command("ATE0\r\n"); + // WIFI热点没有密码只需要发送热点名称 + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n", wifi_ssid); } - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + return_state = wifi_spi_set_parameter(WIFI_SPI_SET_WIFI_INFORMATION, temp_buffer, length, WIFI_CONNECT_TIME_OUT); + + // 本机IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 + wifi_spi_get_ip_addr_port(); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块自身 的 MAC 地址 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_mac()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_mac (void) -{ - uint8 return_state = 0; - uint8 receiver_buffer[64]; - uint32 receiver_len = 64; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPAPMAC?\r\n"); - do - { - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - if(wifi_spi_data_parse(wifi_spi_information.mac, receiver_buffer, '"', '"')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块或者目标WIFI 的 IP 地址(取决于模块当前的工作模式) -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_ip()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_ip (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_STATION == wifi_spi_information.mode) - { - wifi_spi_send_command("AT+CIPSTA?\r\n"); - } - else if(WIFI_SPI_SOFTAP == wifi_spi_information.mode) - { - wifi_spi_send_command("AT+CIPAP?\r\n"); - } - - do - { - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - uint8 receiver_buffer[128]; - uint32 receiver_len = 128; - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - if(wifi_spi_data_parse(wifi_spi_information.local_ip, receiver_buffer, '"', '"')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块的相关信息 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_information()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_information (void) -{ - uint8 return_state = 0; - do - { - // 获取模块版本号 - if(wifi_spi_get_version()) - { - return_state = 1; - break; - } - // 获取模块IP地址 - if(wifi_spi_get_ip()) - { - return_state = 1; - break; - } - // 获取模块MAC信息 - if(wifi_spi_get_mac()) - { - return_state = 1; - break; - } - memcpy(wifi_spi_information.local_port, "no port", 7); - }while(0); - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 连接 WiFi -// 参数说明 wifi_ssid WiFi名称 -// 参数说明 pass_word WiFi密码 -// 参数说明 model 0:查询WiFi连接情况 其他:连接WiFi -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_get_or_connect_wifi("WiFi_name", "Pass_word", 1); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_wifi (char *wifi_ssid, char *pass_word) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SOFTAP == wifi_spi_information.mode) - { - sprintf(temp, "AT+CWSAP=\"%s\",\"%s\",5,3\r\n", wifi_ssid, pass_word); - wifi_spi_send_command(temp); - } - else - { - sprintf(temp, "AT+CWJAP=\"%s\",\"%s\"\r\n", wifi_ssid, pass_word); - wifi_spi_send_command(temp); - } - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 上电是否自动连接WiFi -// 参数说明 model 0:上电不自动连接wifi 其他:上电自动连接wifi -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_auto_connect_wifi(0); //上电不自动连接wifi -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_auto_connect_wifi (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CWAUTOCONN=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置连接模式 -// 参数说明 model 0: 单连接模式 1:多连接模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_connect_model("1"); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_connect_model (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPMUX=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置传输模式 -// 参数说明 model – 0: 普通传输模式 IP断开后不重新连接 -// – 1: Wi-Fi 透传接收模式,仅支持 TCP 单连接、UDP 固定通信对端、SSL 单连接的情况 IP断开后会不断尝试重新连接 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_transfer_model("1"); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_transfer_model (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPMODE=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置模块模式 (Station/SoftAP/Station+SoftAP) -// 参数说明 state 0:无 Wi-Fi 模式,并且关闭 Wi-Fi RF----1: Station 模式----2: SoftAP 模式----3: SoftAP+Station 模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_model("1"); +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 设置连接的Socket信息并尝试连接Socket +// 参数说明 *transport_type 传输类型 +// 参数说明 *ip_addr IP地址 +// 参数说明 *port 目标端口号 +// 参数说明 *local_port 本机端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_socket_connect("TCP", "192.168.2.5", "8080", "6060"); // 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_set_model (wifi_spi_mode_enum mode) +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_socket_connect (char *transport_type, char *ip_addr, char *port, char *local_port) { - uint8 return_state = 0; + uint8 return_state; + uint8 temp_buffer[41]; + uint16 length; + + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n%s\r\n%s\r\n%s\r\n", transport_type, ip_addr, port, local_port); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + return_state = wifi_spi_set_parameter(WIFI_SPI_SET_SOCKET_INFORMATION, temp_buffer, length, SOCKET_CONNECT_TIME_OUT); - if(WIFI_SPI_SOFTAP == mode) - { - wifi_spi_send_command("AT+CWMODE=2\r\n"); - } - else - { - wifi_spi_send_command("AT+CWMODE=1\r\n"); - } - // 设置模块工作模式 - wifi_spi_information.mode = mode; - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + // 本机IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 + wifi_spi_get_ip_addr_port(); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 关闭睡眠模式 -// 参数说明 mode -// 返回参数 uint8 0:成功 1:失败 +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 断开Socket连接 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_socket_disconnect(); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_socket_disconnect (void) +{ + wifi_spi_packets_struct temp_packets; + + return wifi_spi_get_parameter(WIFI_SPI_CLOSE_SOCKET, &temp_packets, OTHER_TIME_OUT); +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 软复位 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 // 使用示例 // 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_close_sleep_model (void) +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_reset (void) { - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+SLEEP=0\r\n"); - // 设置模块工作模式 - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 断开与wifi的连接 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_disconnected_wifi(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_disconnected_wifi (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CWQAP\r\n"); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 进入打开透传模式 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_entry_serianet(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_entry_serianet (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPSEND\r\n"); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 退出透传模式 -// 参数说明 model 0:关闭透传模式 其他:开启透传模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_exit_serianet(1); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_exit_serianet (void) -{ - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - system_delay_ms(20); - wifi_spi_send_command("+++"); - system_delay_ms(1000); - - return 0; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 建立TCP连接 -// 参数说明 ip 远端 IPv4 地址、IPv6 地址,或域名 -// 参数说明 port 远端端口值 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_connect_tcp_servers("192.168.101.110", "8080"); -// 备注信息 如果总是连接不上电脑的TCP服务器 可以尝试使用网线连接电脑 -// 如果是使用WiFi连接 可能会导致模块连接TCP服务器等待较长时间 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_connect_tcp_servers (char *ip, char *port, wifi_spi_transfer_mode_enum mode) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + uint8 return_state; + wifi_spi_head_struct head; + return_state = 1; do { - if(wifi_spi_set_connect_model("0")) + head.command = WIFI_SPI_RESET; + head.length = 0xA5A5; + return_state = wifi_spi_wait_idle(OTHER_TIME_OUT); + if(return_state) { - return_state = 1; break; } + wifi_spi_write(&head.command, sizeof(wifi_spi_head_struct), NULL, 0); + }while(0); + + return return_state; +} - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPSTARTEX=\"TCP\",\"%s\",%s\r\n", ip, port); - wifi_spi_send_command(temp); - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI UDP模式时立即发送函数 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 在UDP模式下模块收到数据后会等待2毫秒,2毫秒后未收到数据则将数据通过socket发送到网络,如果希望立即发送则在数据传输完毕后调用此函数 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_udp_send_now (void) +{ + uint8 return_state = 1; + wifi_spi_packets_struct temp_packets; + + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + do { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - // 设置传输模式 - if(wifi_spi_set_transfer_model(WIFI_SPI_COMMAND == mode ? "0" : "1")) - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPSTATE?\r\n"); - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - else - { - uint8 receiver_buffer[128]; - uint32 receiver_len = 128; - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - char* buffer_index = (char *)receiver_buffer; - char* end_index; - - buffer_index += 22; - buffer_index += strlen(ip); - buffer_index += strlen(port); - end_index = strchr(buffer_index, ','); - - memcpy(wifi_spi_information.local_port, " ", 7); - memcpy(wifi_spi_information.local_port, buffer_index, (end_index - buffer_index)); - } - - wifi_spi_information.connect_state = WIFI_SPI_SERVER_ON; - wifi_spi_information.connect_mode = WIFI_SPI_TCP_CLIENT; - wifi_spi_information.transfer_mode = mode; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SERIANET == mode) // 透传模式下直接开启透传 - { - if(wifi_spi_entry_serianet()) + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) { - return_state = 1; break; } - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 建立UDP连接 -// 参数说明 *ip 远端 IPv4 地址、IPv6 地址 或域名 字符串形式 -// 参数说明 *port 远端端口值 字符串形式 -// 参数说明 *local_port 远端 IPv4 地址、IPv6 地址 或域名 字符串形式 -// 参数说明 mode 模块数据通信模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_connect_udp_client("192.168.101.110", "8080", "8080", WIFI_SPI_COMMAND); -// 备注信息 自动分配ID -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_connect_udp_client (char *ip, char *port, char *local_port, wifi_spi_transfer_mode_enum mode) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - do - { - if(wifi_spi_set_connect_model("0")) - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + // 立即开始socket发送 + temp_packets.head.command = WIFI_SPI_UDP_SEND; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + + // 等待应答信号 + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + + // 接收应答信号 + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, temp_packets.head.length); + + if(WIFI_SPI_REPLY_OK == temp_packets.head.command) + { + return_state = 0; + } + + }while(0); - sprintf(temp, "AT+CIPSTARTEX=\"UDP\",\"%s\",%s,%s\r\n", ip, port, local_port); - wifi_spi_send_command(temp); + // 将通讯状态设置为空闲 + wifi_spi_mutex = WIFI_SPI_IDLE; + } + + return return_state; +} - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 数据块发送函数并同步接收数据 +// 参数说明 *buff 需要发送的数据地址 +// 参数说明 length 发送长度 +// 返回参数 uint32 剩余未发送的长度 +// 使用示例 wifi_spi_send_buffer(buffer, 100); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +uint32 wifi_spi_send_buffer (const uint8 *buffer, uint32 length) +{ + uint16 send_length; + wifi_spi_packets_struct temp_packets; + + // 检查WIFI SPI状态,如果在其他中断或者线程中已经发起了通讯,则本次不能发送数据 + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + + while(length) { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_spi_set_transfer_model(WIFI_SPI_COMMAND == mode ? "0" : "1")) // 设置传输模式 - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SERIANET == mode) // 透传模式下直接开启透传 - { - if(wifi_spi_entry_serianet()) + send_length = length > WIFI_SPI_TRANSFER_SIZE ? (uint16)WIFI_SPI_TRANSFER_SIZE : (uint16)length; + + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) { - return_state = 1; break; } - } - memcpy(wifi_spi_information.local_port, " ", 7); - memcpy(wifi_spi_information.local_port, local_port, strlen(local_port)); - wifi_spi_information.connect_state = WIFI_SPI_SERVER_ON; - wifi_spi_information.connect_mode = WIFI_SPI_UDP_CLIENT; - wifi_spi_information.transfer_mode = mode; - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 断开连接 TCP Server 使用本接口将会断开所有连接 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_disconnect_link(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_disconnect_link (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - do - { - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - wifi_spi_send_command("AT+CIPCLOSE=5\r\n"); - } - else - { - wifi_spi_send_command("AT+CIPCLOSE\r\n"); - } - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送字节函数 -// 参数说明 data 需要发送的数据 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_byte(0xa5); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_byte (uint8 data) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - send_length = 1; - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data(&data, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else - { - send_length = (uint16)wifi_spi_write_data(&data, send_length); - } - } - } - - return send_length; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送缓冲区函数 -// 参数说明 buff 需要发送的数据地址 -// 参数说明 len 发送长度 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_buffer("123", 3); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 len) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - while(len) - { - if((WIFI_SPI_WRITE_MAX * 2) < len) send_length = WIFI_SPI_WRITE_MAX * 2; - else - { - send_length = (uint16)len; - } - len -= send_length; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data(buff, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } - buff += send_length; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else - { - len = wifi_spi_write_data(buff, len); - } - } - } - - return len; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送缓冲区函数(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 -// 备注信息 需要发送多个数组时,采用此函数可以极大的降低通讯时间,发送数据总长度不能超过4092 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_buffer_multi (wifi_spi_send_multi_struct *multi_buffer) -{ - uint8 i; - uint16 remain_length; - - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - for(i = 0; i < WIFI_SPI_MAX_MULTI; i++) - { - if(multi_buffer->source[i]) wifi_spi_send_buffer(multi_buffer->source[i], multi_buffer->length[i]); - } - } - else - { - remain_length = (uint16)wifi_spi_write_data_multi(multi_buffer); - } - } - } - - return remain_length; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送字符串函数 -// 参数说明 *str 需要发送的数据 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_string("123"); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_string (const char *str) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - send_length = (uint16)strlen(str); - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data((uint8 *)str, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } + wifi_spi_transfer_data(buffer, &temp_packets, send_length); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) { - send_length = (uint16)wifi_spi_write_data((uint8 *)str, send_length); + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + + length -= send_length; + buffer += send_length; + } + + // 检查最后一次的接收是否将所有的数据都接收完毕 + while(WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) + { + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + + // 继续读取模块剩余数据 + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } } } + wifi_spi_mutex = WIFI_SPI_IDLE; } - - return send_length; + return length; } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi 模块数据接收函数 -// 参数说明 buffer 接收数据的存放地址 -// 参数说明 len 数组长度,可直接填写或者使用sizeof求得 -// 返回参数 uint32 返回实际接收到的数据长度 -// 使用示例 uint8 test_buffer[256]; wifi_spi_read_buffer(&test_buffer[0], sizeof(test_buffer)); +// 函数简介 WIFI SPI 读取缓冲区 +// 参数说明 *buff 接收缓冲区 +// 参数说明 length 读取数据长度 +// 返回参数 uint32 实际读取数据长度 +// 使用示例 wifi_spi_read_buffer(buffer, 100); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 len) +uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 length) { - fifo_read_buffer(&wifi_spi_fifo, buffer, &len, FIFO_READ_AND_CLEAN); - return len; + zf_assert(NULL != buffer); + uint32 data_len = length; + +#if(1 == WIFI_SPI_READ_TRANSFER) + + wifi_spi_packets_struct temp_packets; + // 检查WIFI SPI状态,如果在其他中断或者线程中已经发起了通讯,则本次不能发送数据 + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + + // 发起通讯查看模块内是否有数据未读取 + do + { + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + }while(WIFI_SPI_REPLY_DATA_START == temp_packets.head.command); + wifi_spi_mutex = WIFI_SPI_IDLE; + } +#endif + + fifo_read_buffer(&wifi_spi_fifo, buffer, &data_len, FIFO_READ_AND_CLEAN); + return data_len; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 wifi spi handshake中断回调函数 -// 参数说明 void -// 返回参数 void -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -void wifi_spi_callback (void) -{ - wifi_spi_check_state_read_buffer(); - wifi_spi_ack_flag = 1; // ACK标志位置1 -} - - //------------------------------------------------------------------------------------------------------------------- // 函数简介 WiFi 模块初始化 // 参数说明 *wifi_ssid 目标连接的 WiFi 的名称 字符串形式 // 参数说明 *pass_word 目标连接的 WiFi 的密码 字符串形式 -// 参数说明 wifi_mode 模块的工作模式 参照 zf_device_wireless_spi.h 中 wifi_spi_mode_enum 枚举 // 返回参数 uint8 模块初始化状态 0-成功 1-错误 -// 使用示例 wifi_spi_init("SEEKFREE_2.4G", "SEEKFREEV2", WIFI_UART_STATION); -// 备注信息 初始化会首先设置串口配置,之后会对模块进行基本参数配置 -// 具体的配置信息可以在 zf_device_wireless_spi.h 文件中修改 +// 使用示例 wifi_spi_init("SEEKFREE", "SEEKFREE123"); +// 备注信息 wifi_spi_init("SEEKFREE", NULL); // 连接没有密码的WIFI热点 //------------------------------------------------------------------------------------------------------------------- -uint8 wifi_spi_init (char *wifi_ssid, char *pass_word, wifi_spi_mode_enum wifi_mode) +uint8 wifi_spi_init (char *wifi_ssid, char *pass_word) { uint8 return_state = 0; - uint32 temp_isr; - - spi_init(WIFI_SPI_INDEX, SPI_MODE0, WIFI_SPI_SPEED, WIFI_SPI_SCK_PIN, WIFI_SPI_MOSI_PIN, WIFI_SPI_MISO_PIN, SPI_CS_NULL);//硬件SPI初始化 - set_wireless_type(WIFI_SPI, wifi_spi_callback); - fifo_init(&wifi_spi_fifo, FIFO_DATA_8BIT, wifi_spi_buffer, WIFI_SPI_BUFFER_SIZE); + fifo_init(&wifi_spi_fifo, FIFO_DATA_8BIT, wifi_spi_buffer, WIFI_SPI_RECVIVE_FIFO_SIZE); + spi_init(WIFI_SPI_INDEX, SPI_MODE3, WIFI_SPI_SPEED, WIFI_SPI_SCK_PIN, WIFI_SPI_MOSI_PIN, WIFI_SPI_MISO_PIN, SPI_CS_NULL);//硬件SPI初始化 gpio_init(WIFI_SPI_CS_PIN, GPO, 1, GPO_PUSH_PULL); gpio_init(WIFI_SPI_RST_PIN, GPO, 1, GPO_PUSH_PULL); - - temp_isr = interrupt_global_disable(); - - exti_init(WIFI_SPI_INT_PIN, EXTI_TRIGGER_RISING); - + gpio_init(WIFI_SPI_INT_PIN, GPI, 0, GPI_PULL_DOWN); + + // 复位 gpio_set_level(WIFI_SPI_RST_PIN, 0); - system_delay_ms(50); + system_delay_ms(10); gpio_set_level(WIFI_SPI_RST_PIN, 1); - system_delay_ms(1000); + + // 等待模块初始化 + system_delay_ms(100); + wifi_spi_mutex = WIFI_SPI_IDLE; - exti_flag_clear(WIFI_SPI_INT_PIN); - - interrupt_global_enable(temp_isr); do { - if(wifi_spi_echo_set("0")) // 关闭模块回写 + // 固件版本信息以字符串形式保存在wifi_spi_version数组中 + return_state = wifi_spi_get_version(); + if(return_state) + { + break; + } + + // MAC地址信息以字符串形式保存在wifi_spi_mac_addr数组中 + wifi_spi_get_mac_addr(); + + + return_state = wifi_spi_wifi_connect(wifi_ssid, pass_word); + if(return_state) { - zf_log(0, "exit echo failed"); - return_state = 1; break; } - if(wifi_spi_auto_connect_wifi("0")) // 关闭自动连接 + #if(1 == WIFI_SPI_AUTO_CONNECT) + return_state = wifi_spi_socket_connect("TCP", WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT); + if(return_state) { - zf_log(0, "close auto connect failed"); - return_state = 1; break; } - - if(wifi_spi_set_model(wifi_mode)) // 设置运行模式 + #endif + + #if(2 == WIFI_SPI_AUTO_CONNECT) + return_state = wifi_spi_socket_connect("UDP", WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT); + if(return_state) { - zf_log(0, "set run mode failed"); - return_state = 1; break; } - - if(wifi_spi_close_sleep_model()) // 关闭睡眠模式 - { - zf_log(0, "set sleep mode failed"); - return_state = 1; - break; - } - - if(wifi_spi_set_wifi((char *)wifi_ssid, (char *)pass_word)) // 连接 wifi 或者开启热点 - { - zf_log(0, "wifi set failed"); - return_state = 1; - break; - } - - if(wifi_spi_get_information()) // 模块基本参数获取 - { - zf_log(0, "get module information failed"); - return_state = 1; - break; - } -#if WIFI_SPI_AUTO_CONNECT == 1 - if(wifi_spi_connect_tcp_servers(WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_SERIANET)) // 连接TCP服务器 - { - zf_log(0, "connect TCP server failed"); - return_state = 1; - break; - } -#endif -#if WIFI_SPI_AUTO_CONNECT == 2 - if(wifi_spi_connect_udp_client(WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT, WIFI_SPI_SERIANET)) // 建立UDP连接 - { - zf_log(0, "connect UDP server failed"); - return_state = 1; - break; - } -#endif - // 模块初始化成功 - wifi_spi_init_flag = 1; + #endif }while(0); - + return return_state; } diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_wifi_spi.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_wifi_spi.h index 5e5a025..24e7eb1 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_wifi_spi.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_wifi_spi.h @@ -24,13 +24,13 @@ * 文件名称 zf_device_wifi_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 * 日期 作者 备注 -* 2023-05-27 pudding first version +* 2024-01-18 SeekFree first version ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,128 +53,100 @@ #include "zf_common_typedef.h" + #define WIFI_SPI_INDEX (SPI_3 ) // 定义使用的SPI号 -#define WIFI_SPI_SPEED (30 * 1000 * 1000 ) // 硬件 SPI 速率 +#define WIFI_SPI_SPEED (50 * 1000 * 1000 ) // 硬件 SPI 速率 #define WIFI_SPI_SCK_PIN (SPI3_SCLK_P22_3 ) // 定义SPI_SCK引脚 #define WIFI_SPI_MOSI_PIN (SPI3_MOSI_P22_0 ) // 定义SPI_MOSI引脚 #define WIFI_SPI_MISO_PIN (SPI3_MISO_P22_1 ) // 定义SPI_MISO引脚 IPS没有MISO引脚,但是这里任然需要定义,在spi的初始化时需要使用 #define WIFI_SPI_CS_PIN (P22_2 ) // 定义SPI_CS引脚 采用软件CS引脚 -#define WIFI_SPI_INT_PIN (ERU_CH5_REQ1_P15_8) // 定义中断引脚 +#define WIFI_SPI_INT_PIN (P15_8 ) // 定义握手引脚 #define WIFI_SPI_RST_PIN (P23_1 ) // 定义复位引脚 - - -#define WIFI_SPI_BUFFER_SIZE (1024) // 定义SPI接收的缓冲区大小 -#define WIFI_SPI_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不连接 1-自动连接TCP服务器并进入透传模式 2-自动连接UDP服务器并进入透传模式 3:自动建立TCP服务器 - -#if (WIFI_SPI_AUTO_CONNECT > 2) + +#define WIFI_SPI_RECVIVE_FIFO_SIZE (1024) // 接收FIFO大小 +#define WIFI_SPI_READ_TRANSFER (1) // 在调用wifi_spi_read_buffer 是否尝试发起SPI通讯来检测模块内是否有数据需要读取 1:发起SPI通讯 0:不发起SPI通讯,仅读取FIFO + // 如果应用程序中没有任何的地方调用发送函数,则WIFI_SPI_READ_TRANSFER必须设置为1 + +#define WIFI_SPI_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不自动连接 1-自动连接TCP服务器 2-自动连接UDP + +#if (WIFI_SPI_AUTO_CONNECT > 2) #error "WIFI_SPI_AUTO_CONNECT 的值只能为 [0,1,2]" #else -#define WIFI_SPI_TARGET_IP "192.168.2.28" // 连接目标的 IP +#define WIFI_SPI_TARGET_IP "192.168.137.1" // 连接目标的 IP #define WIFI_SPI_TARGET_PORT "8080" // 连接目标的端口 -#define WIFI_SPI_LOCAL_PORT "8080" // 本机端口 +#define WIFI_SPI_LOCAL_PORT "6666" // 本机的端口 0:随机 可设置范围2048-65535 默认 6666 #endif -#define WIFI_SPI_MAX_MULTI (17) // 多地址发送,最大8个地址 -typedef enum -{ - BUFFER_IDLE, // 模块的缓冲区是空闲的 - BUFFER_READ, // 模块的缓冲区有数据需要读取 - BUFFER_WRITE, // 模块的缓冲区是可写的 -}wifi_spi_buffer_state_enum; +#define WIFI_SPI_RECVIVE_SIZE (32) // 每次SPI传输接收的字节数 不允许修改 +#define WIFI_SPI_TRANSFER_SIZE (4088) // 最大SPI传输接收的字节数 不允许修改 + + typedef enum -{ - TRANSMIT_IDLE, // 当前没有传输 - TRANSMIT_WRITE_REQUEST, // 给模块发送了一个传输请求 - TRANSMIT_READ_STATE, // 读取模块状态 - TRANSMIT_READ, // 正在读取模块内部数据 - TRANSMIT_WRITE, // 正在往模块写入数据 -}wifi_spi_transmit_state_enum; - -typedef enum -{ - WIFI_SPI_STATION, // 设备模式 - WIFI_SPI_SOFTAP, // AP模式 -}wifi_spi_mode_enum; - -typedef enum -{ - WIFI_SPI_COMMAND, // 使用命令的方式发送数据 - WIFI_SPI_SERIANET, // 使用透传的方式发送数据 -}wifi_spi_transfer_mode_enum; - -typedef enum -{ - WIFI_SPI_TCP_CLIENT, // 模块连接TCP服务器 - WIFI_SPI_TCP_SERVER, // 模块作为TCP服务器 - WIFI_SPI_UDP_CLIENT, // 模块启用UDP连接 -}wifi_spi_connect_mode_enum; - -typedef enum -{ - WIFI_SPI_SERVER_OFF, // 模块未连接服务器 - WIFI_SPI_SERVER_ON, // 模块已经连接服务器 -}wifi_spi_connect_state_enum; - -typedef enum -{ - WIFI_SPI_LINK_0, // 模块当前链接 0 - WIFI_SPI_LINK_1, // 模块当前链接 1 - WIFI_SPI_LINK_2, // 模块当前链接 2 - WIFI_SPI_LINK_3, // 模块当前链接 3 - WIFI_SPI_LINK_4, // 模块当前链接 4 -}wifi_spi_link_id_enum; - -typedef struct { - uint8 reserve; - uint8 cmd; - uint8 addr; - uint8 dummy; - uint8 magic; - uint8 sequence; - uint16 length; -}wifi_spi_buffer_struct; + // 主机发送的命令 + WIFI_SPI_INVALID1 = 0x00, // 无效数据包 + WIFI_SPI_RESET = 0x01, // 复位命令 + WIFI_SPI_DATA = 0x02, // 透传数据包 + WIFI_SPI_UDP_SEND = 0x03, // UDP下立即发送命令,默认SPI接收数据后2MS未收到数据自动发送数据 + WIFI_SPI_CLOSE_SOCKET = 0x04, // 断开连接 + + WIFI_SPI_SET_WIFI_INFORMATION = 0x10, // 设置WIFI信息命令 + WIFI_SPI_SET_SOCKET_INFORMATION = 0x11, // 设置SOCKET信息命令 + + WIFI_SPI_GET_VERSION = 0x20, // 获取模块版本 + WIFI_SPI_GET_MAC_ADDR = 0x21, // 获取模块MAC地址 + WIFI_SPI_GET_IP_ADDR = 0x22, // 获取模块IP地址 + + // 从机回传的命令 + WIFI_SPI_REPLY_OK = 0x80, // 从机应答的正确命令 + WIFI_SPI_REPLY_ERROR = 0x81, // 从机应答的错误命令 + + WIFI_SPI_REPLY_DATA_START = 0x90, // 从机回传的数据包,并且还有数据需要主机读取 + WIFI_SPI_REPLY_DATA_END = 0x91, // 从机回传的数据包,数据已读取完毕 + + WIFI_SPI_REPLY_VERSION = 0xA0, // 从机回复固件版本 + WIFI_SPI_REPLY_MAC_ADDR = 0xA1, // 从机回复本机MAC地址等信息 + WIFI_SPI_REPLY_IP_ADDR = 0xA2, // 从机回复本机IP地址、端口号 + WIFI_SPI_INVALID2 = 0xFF // 无效数据包 +}wifi_spi_packets_command_enum; + +typedef enum +{ + WIFI_SPI_IDLE, // 模块空闲,可以进行SPI通讯 + WIFI_SPI_BUSY, // 模块正忙,不可进行SPI通讯 +}wifi_spi_state_enum; + + +typedef struct +{ + uint8 command; // 命令字 + uint8 reserve; // 保留 + uint16 length; // 包有效长度 +}wifi_spi_head_struct; + + +typedef struct +{ + wifi_spi_head_struct head; // 帧头 + uint8 buffer[WIFI_SPI_RECVIVE_SIZE]; // 缓冲区 +}wifi_spi_packets_struct; + + +extern char wifi_spi_version[12]; // 固件版本 字符串 +extern char wifi_spi_mac_addr[20]; // 模块MAC地址 字符串 +extern char wifi_spi_ip_addr_port[25]; // IP地址与端口号 字符串 -typedef struct -{ - uint8 version[12]; // 固件版本 字符串形式 - uint8 mac[20]; // 本机 MAC 地址 字符串形式 - uint8 local_ip[17]; // 本机 IP 地址 字符串形式 - uint8 local_port[10]; // 本机端口号 字符串形式 - uint8 remote_ip[5][17]; // 远端 IP 地址 字符串形式 - wifi_spi_mode_enum mode; // WIFI 模式 - wifi_spi_transfer_mode_enum transfer_mode; // 当前传输模式 - wifi_spi_connect_mode_enum connect_mode; // 网络连接模式 - wifi_spi_connect_state_enum connect_state; // 服务器连接情况 -}wifi_spi_information_struct; +uint8 wifi_spi_wifi_connect (char *wifi_ssid, char *pass_word); +uint8 wifi_spi_socket_connect (char *transport_type, char *ip_addr, char *port, char *local_port); +uint8 wifi_spi_socket_disconnect (void); +uint8 wifi_spi_udp_send_now (void); +uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 length); +uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 length); -typedef struct -{ - uint8 *source[WIFI_SPI_MAX_MULTI]; - uint16 length[WIFI_SPI_MAX_MULTI]; -}wifi_spi_send_multi_struct; - -extern wifi_spi_information_struct wifi_spi_information; - - -uint8 wifi_spi_disconnected_wifi (void); // 断开 WIFI 连接 -uint8 wifi_spi_entry_serianet (void); // 打开透传模式 -uint8 wifi_spi_exit_serianet (void); // 关闭透传模式 - -uint8 wifi_spi_connect_tcp_servers (char *ip, char *port, wifi_spi_transfer_mode_enum mode); // 建立 TCP 连接 -uint8 wifi_spi_connect_udp_client (char *ip, char *port, char *local_port, wifi_spi_transfer_mode_enum mode); // 建立 UDP 传输 -uint8 wifi_spi_disconnect_link (void); // 断开连接 TCP Server 使用本接口将会断开所有连接 - -uint32 wifi_spi_send_byte (uint8 data); // WIFI 模块发送字节函数 -uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 length); // WIFI 模块发送缓冲区函数 -uint32 wifi_spi_send_buffer_multi (wifi_spi_send_multi_struct *multi_buffer); // WIFI 模块发送多缓冲区函数 -uint32 wifi_spi_send_string (const char *str); // WIFI 模块发送字符串函数 - -uint32 wifi_spi_read_buffer (uint8 *buff, uint32 len); // WIFI 模块数据接收函数 - -uint8 wifi_spi_init (char *wifi_ssid, char *pass_word, wifi_spi_mode_enum wifi_mode); // WIFI 模块初始化函数 +uint8 wifi_spi_init (char *wifi_ssid, char *pass_word); #endif + diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_wifi_uart.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_wifi_uart.c index 312dab7..ff728bb 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_wifi_uart.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_wifi_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_wifi_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -61,7 +61,7 @@ wifi_uart_information_struct wifi_uart_information; // 模块自身参数 -static fifo_obj_struct wifi_uart_fifo; +static fifo_struct wifi_uart_fifo; static uint8 wifi_uart_buffer[WIFI_UART_BUFFER_SIZE]; // 数据存放数组 static uint8 wifi_uart_data; diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_wifi_uart.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_wifi_uart.h index abcb253..3316b6f 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_wifi_uart.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_wifi_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_wifi_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_wireless_uart.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_wireless_uart.c index eac2867..91ec013 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_wireless_uart.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_wireless_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_wireless_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -53,7 +53,7 @@ #include "zf_device_type.h" #include "zf_device_wireless_uart.h" -static fifo_obj_struct wireless_uart_fifo; +static fifo_struct wireless_uart_fifo; static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; static uint8 wireless_uart_data = 0; diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_wireless_uart.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_wireless_uart.h index 2418545..a789ad0 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_wireless_uart.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_wireless_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_wireless_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -61,11 +61,11 @@ // 注意事项2:开启自动波特率务必连接RTS引脚 否则会开启失败。 // 注意事项3:模块自动波特率失败的话 可以尝试断电重启 -// 开启自动波特率务必阅读上面两条 注意事项 -// 开启自动波特率务必阅读上面两条 注意事项 -// 开启自动波特率务必阅读上面两条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 -// 0:关闭自动波特率 +// 0:关闭自动波特率 // 1:开启自动波特率 自动波特率的作用是修改 WIRELESS_UART_BAUD 之后不需要对模块进行配置 模块会自动设置为对应的波特率 #define WIRELESS_UART_AUTO_BAUD_RATE ( 1 ) diff --git a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_adc.c b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_adc.c index 9a262a1..06694d8 100644 --- a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_adc.c +++ b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_adc.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_adc * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_adc.h b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_adc.h index 378b67e..f017c76 100644 --- a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_adc.h +++ b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_adc.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_adc * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_delay.c b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_delay.c index 4ec533c..ae3e610 100644 --- a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_delay.c +++ b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_delay.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_delay * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_delay.h b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_delay.h index e8d82ef..7b8b475 100644 --- a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_delay.h +++ b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_delay.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_delay * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_dma.c b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_dma.c index f72f1d6..43bffbc 100644 --- a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_dma.c +++ b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_dma.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_dma * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_dma.h b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_dma.h index 1ec555b..320d40c 100644 --- a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_dma.h +++ b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_dma.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_dma * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_encoder.c b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_encoder.c index 6592198..0e0e0b9 100644 --- a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_encoder.c +++ b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_encoder.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_encoder.h b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_encoder.h index 68d159f..e079122 100644 --- a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_encoder.h +++ b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_encoder.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_exti.c b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_exti.c index 72c9a1f..31d270a 100644 --- a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_exti.c +++ b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_exti.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_exti * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_exti.h b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_exti.h index 30f5ef6..b63f9ee 100644 --- a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_exti.h +++ b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_exti.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_exti * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_flash.c b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_flash.c index f91f5a0..325cfed 100644 --- a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_flash.c +++ b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_flash.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_flash * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_flash.h b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_flash.h index 912585a..e7425fd 100644 --- a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_flash.h +++ b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_flash.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_flash * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_gpio.c b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_gpio.c index 5071114..a084353 100644 --- a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_gpio.c +++ b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_gpio.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_gpio * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_gpio.h b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_gpio.h index 2b23be0..550fb8d 100644 --- a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_gpio.h +++ b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_gpio.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_gpio * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_pit.c b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_pit.c index c4dc50d..5e03d38 100644 --- a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_pit.c +++ b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_pit.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pit * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_pit.h b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_pit.h index 5461e05..66854b5 100644 --- a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_pit.h +++ b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_pit.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pit * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_pwm.c b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_pwm.c index ad1059a..24d8d7a 100644 --- a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_pwm.c +++ b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_pwm.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pwm * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_pwm.h b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_pwm.h index d6dce78..51948a4 100644 --- a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_pwm.h +++ b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_pwm.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pwm * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_soft_iic.c b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_soft_iic.c index 9833b62..a349ec7 100644 --- a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_soft_iic.c +++ b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_soft_iic.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_iic * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_soft_iic.h b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_soft_iic.h index a62b262..80db53b 100644 --- a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_soft_iic.h +++ b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_soft_iic.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_iic * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_soft_spi.c b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_soft_spi.c index 292c60b..954fbe3 100644 --- a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_soft_spi.c +++ b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_soft_spi.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_soft_spi.h b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_soft_spi.h index 6a9c207..62858de 100644 --- a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_soft_spi.h +++ b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_soft_spi.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_spi.c b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_spi.c index 1b99196..f817dd9 100644 --- a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_spi.c +++ b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_spi.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -920,7 +920,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 do { - IfxQspi_writeTransmitFifo(moudle, (uint8)(*write_buffer & 0xFF00) >> 8); // 将发送的数据写入缓冲区 + IfxQspi_writeTransmitFifo(moudle, (uint8)((*write_buffer & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 if(read_buffer != NULL) { diff --git a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_spi.h b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_spi.h index e73507e..d15589c 100644 --- a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_spi.h +++ b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_spi.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_timer.c b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_timer.c index a953b92..e085d6e 100644 --- a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_timer.c +++ b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_timer.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_timer * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_timer.h b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_timer.h index 3c86f58..1bb348f 100644 --- a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_timer.h +++ b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_timer.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_timer * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_uart.c b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_uart.c index cd19782..fb89b55 100644 --- a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_uart.c +++ b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_uart.h b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_uart.h index 8d1d111..cdc55ab 100644 --- a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_uart.h +++ b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/user/isr.c b/Example/E02_uart_demo/user/isr.c index 99930e9..9898030 100644 --- a/Example/E02_uart_demo/user/isr.c +++ b/Example/E02_uart_demo/user/isr.c @@ -24,7 +24,7 @@ * 文件名称 isr * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -118,7 +118,7 @@ IFX_INTERRUPT(exti_ch1_ch5_isr, 0, EXTI_CH1_CH5_INT_PRIO) { exti_flag_clear(ERU_CH5_REQ1_P15_8); - wireless_module_spi_handler(); // SPI WIFI 中断回调函数 + } } diff --git a/Example/E03_adc_demo/libraries/doc/version.txt b/Example/E03_adc_demo/libraries/doc/version.txt index b841b50..d644136 100644 --- a/Example/E03_adc_demo/libraries/doc/version.txt +++ b/Example/E03_adc_demo/libraries/doc/version.txt @@ -1,3 +1,8 @@ +V3.2.6 + 更新逐飞助手接口函数 调用初始化时直接传参通信类 + 更新wifi SPI驱动文件 提高通信效率 + 更新GPS驱动文件,更名为GNSS,兼容普通定位模块及RTK + V3.2.5 修复延时函数初始化参数及中断向量表问题 V3.2.4 diff --git a/Example/E03_adc_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h b/Example/E03_adc_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h index 28ff689..371e6b6 100644 --- a/Example/E03_adc_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h +++ b/Example/E03_adc_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h @@ -34,7 +34,7 @@ /*------------------------------------------Configuration for IfxScu_cfg.h-------------------------------------------*/ /*********************************************************************************************************************/ /* External oscillator frequency in Hz */ -#define IFX_CFG_SCU_XTAL_FREQUENCY (20000000) /* Allowed values are: 16000000, 20000000 or 40000000 */ +#define IFX_CFG_SCU_XTAL_FREQUENCY (20000000) /* Allowed values are9p: 16000000, 20000000 or 40000000 */ /* PLL frequency in Hz */ #define IFX_CFG_SCU_PLL_FREQUENCY (200000000) /* Allowed values are: 80000000, 133000000, 160000000 * or 200000000 */ diff --git a/Example/E03_adc_demo/libraries/zf_common/zf_common_clock.c b/Example/E03_adc_demo/libraries/zf_common/zf_common_clock.c index 5023270..9872ea9 100644 --- a/Example/E03_adc_demo/libraries/zf_common/zf_common_clock.c +++ b/Example/E03_adc_demo/libraries/zf_common/zf_common_clock.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_clock * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_common/zf_common_clock.h b/Example/E03_adc_demo/libraries/zf_common/zf_common_clock.h index 9face65..2b50396 100644 --- a/Example/E03_adc_demo/libraries/zf_common/zf_common_clock.h +++ b/Example/E03_adc_demo/libraries/zf_common/zf_common_clock.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_clock * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_common/zf_common_debug.c b/Example/E03_adc_demo/libraries/zf_common/zf_common_debug.c index 52c623d..d680265 100644 --- a/Example/E03_adc_demo/libraries/zf_common/zf_common_debug.c +++ b/Example/E03_adc_demo/libraries/zf_common/zf_common_debug.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_debug * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -46,7 +46,7 @@ static volatile uint8 zf_debug_assert_enable = 1; #if DEBUG_UART_USE_INTERRUPT // 如果启用 debug uart 接收中断 uint8 debug_uart_buffer[DEBUG_RING_BUFFER_LEN]; // 数据存放数组 uint8 debug_uart_data; -fifo_obj_struct debug_uart_fifo; +fifo_struct debug_uart_fifo; #endif //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E03_adc_demo/libraries/zf_common/zf_common_debug.h b/Example/E03_adc_demo/libraries/zf_common/zf_common_debug.h index 881a297..4fb4d91 100644 --- a/Example/E03_adc_demo/libraries/zf_common/zf_common_debug.h +++ b/Example/E03_adc_demo/libraries/zf_common/zf_common_debug.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_debug * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_common/zf_common_fifo.c b/Example/E03_adc_demo/libraries/zf_common/zf_common_fifo.c index b010d3e..94f5133 100644 --- a/Example/E03_adc_demo/libraries/zf_common/zf_common_fifo.c +++ b/Example/E03_adc_demo/libraries/zf_common/zf_common_fifo.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_fifo * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -45,7 +45,7 @@ // 使用示例 fifo_head_offset(fifo, 1); // 备注信息 本函数在文件内部调用 用户不用关注 也不可修改 //------------------------------------------------------------------------------------------------------------------- -static void fifo_head_offset (fifo_obj_struct *fifo, uint32 offset) +static void fifo_head_offset (fifo_struct *fifo, uint32 offset) { fifo->head += offset; @@ -63,7 +63,7 @@ static void fifo_head_offset (fifo_obj_struct *fifo, uint32 offset) // 使用示例 fifo_end_offset(fifo, 1); // 备注信息 本函数在文件内部调用 用户不用关注 也不可修改 //------------------------------------------------------------------------------------------------------------------- -static void fifo_end_offset (fifo_obj_struct *fifo, uint32 offset) +static void fifo_end_offset (fifo_struct *fifo, uint32 offset) { fifo->end += offset; @@ -80,7 +80,7 @@ static void fifo_end_offset (fifo_obj_struct *fifo, uint32 offset) // 使用示例 fifo_clear(fifo); // 备注信息 清空当前 FIFO 对象的内存 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_clear (fifo_obj_struct *fifo) +fifo_state_enum fifo_clear (fifo_struct *fifo) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -113,7 +113,7 @@ fifo_state_enum fifo_clear (fifo_obj_struct *fifo) // 使用示例 uint32 len = fifo_used(fifo); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 fifo_used (fifo_obj_struct *fifo) +uint32 fifo_used (fifo_struct *fifo) { zf_assert(fifo != NULL); return (fifo->max - fifo->size); // 返回当前 FIFO 缓冲区中数据个数 @@ -127,7 +127,7 @@ uint32 fifo_used (fifo_obj_struct *fifo) // 使用示例 zf_log(fifo_write_element(&fifo, data) == FIFO_SUCCESS, "fifo_write_byte error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat) +fifo_state_enum fifo_write_element (fifo_struct *fifo, uint32 dat) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -171,7 +171,7 @@ fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat) // 使用示例 zf_log(fifo_write_buffer(&fifo, data, 32) == FIFO_SUCCESS, "fifo_write_buffer error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 length) +fifo_state_enum fifo_write_buffer (fifo_struct *fifo, void *dat, uint32 length) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -286,7 +286,7 @@ fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 leng // 使用示例 zf_log(fifo_read_element(&fifo, data, FIFO_READ_ONLY) == FIFO_SUCCESS, "fifo_read_byte error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operation_enum flag) +fifo_state_enum fifo_read_element (fifo_struct *fifo, void *dat, fifo_operation_enum flag) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -348,7 +348,7 @@ fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operat // 使用示例 zf_log(fifo_read_buffer(&fifo, data, &length, FIFO_READ_ONLY) == FIFO_SUCCESS, "fifo_read_buffer error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) +fifo_state_enum fifo_read_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) { zf_assert(NULL != fifo); zf_assert(NULL != length); @@ -447,7 +447,7 @@ fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *leng // 如果使用 FIFO_READ_AND_CLEAN 操作 将会丢弃所有数据并清空整个 FIFO // 如果使用 FIFO_READ_AND_CLEAN 操作 将会丢弃所有数据并清空整个 FIFO //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) +fifo_state_enum fifo_read_tail_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) { zf_assert(NULL != fifo); zf_assert(NULL != length); @@ -541,7 +541,7 @@ fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 // 使用示例 fifo_init(&user_fifo, user_buffer, 64); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_init (fifo_obj_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size) +fifo_state_enum fifo_init (fifo_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; diff --git a/Example/E03_adc_demo/libraries/zf_common/zf_common_fifo.h b/Example/E03_adc_demo/libraries/zf_common/zf_common_fifo.h index 5cc7668..901a913 100644 --- a/Example/E03_adc_demo/libraries/zf_common/zf_common_fifo.h +++ b/Example/E03_adc_demo/libraries/zf_common/zf_common_fifo.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_fifo * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -91,17 +91,17 @@ typedef struct uint32 end; // 缓存尾指针 总是指向非空缓存(缓存全空除外) uint32 size; // 缓存剩余大小 uint32 max; // 缓存总大小 -}fifo_obj_struct; +}fifo_struct; -fifo_state_enum fifo_clear (fifo_obj_struct *fifo); -uint32 fifo_used (fifo_obj_struct *fifo); +fifo_state_enum fifo_clear (fifo_struct *fifo); +uint32 fifo_used (fifo_struct *fifo); -fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat); -fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 length); -fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operation_enum flag); -fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); -fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); +fifo_state_enum fifo_write_element (fifo_struct *fifo, uint32 dat); +fifo_state_enum fifo_write_buffer (fifo_struct *fifo, void *dat, uint32 length); +fifo_state_enum fifo_read_element (fifo_struct *fifo, void *dat, fifo_operation_enum flag); +fifo_state_enum fifo_read_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); +fifo_state_enum fifo_read_tail_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); -fifo_state_enum fifo_init (fifo_obj_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size); +fifo_state_enum fifo_init (fifo_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size); #endif diff --git a/Example/E03_adc_demo/libraries/zf_common/zf_common_font.c b/Example/E03_adc_demo/libraries/zf_common/zf_common_font.c index c816f9d..ee1df09 100644 --- a/Example/E03_adc_demo/libraries/zf_common/zf_common_font.c +++ b/Example/E03_adc_demo/libraries/zf_common/zf_common_font.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_font * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_common/zf_common_font.h b/Example/E03_adc_demo/libraries/zf_common/zf_common_font.h index 24b8602..7531250 100644 --- a/Example/E03_adc_demo/libraries/zf_common/zf_common_font.h +++ b/Example/E03_adc_demo/libraries/zf_common/zf_common_font.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_font * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_common/zf_common_function.c b/Example/E03_adc_demo/libraries/zf_common/zf_common_function.c index d403fb5..acf2739 100644 --- a/Example/E03_adc_demo/libraries/zf_common/zf_common_function.c +++ b/Example/E03_adc_demo/libraries/zf_common/zf_common_function.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_function * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_common/zf_common_function.h b/Example/E03_adc_demo/libraries/zf_common/zf_common_function.h index f5683e1..101b58a 100644 --- a/Example/E03_adc_demo/libraries/zf_common/zf_common_function.h +++ b/Example/E03_adc_demo/libraries/zf_common/zf_common_function.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_function * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_common/zf_common_headfile.h b/Example/E03_adc_demo/libraries/zf_common/zf_common_headfile.h index aa06ef8..86762db 100644 --- a/Example/E03_adc_demo/libraries/zf_common/zf_common_headfile.h +++ b/Example/E03_adc_demo/libraries/zf_common/zf_common_headfile.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_headfile * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -82,7 +82,7 @@ //===================================================外接设备驱动层=================================================== #include "zf_device_absolute_encoder.h" #include "zf_device_bluetooth_ch9141.h" -#include "zf_device_gps_tau1201.h" +#include "zf_device_gnss.h" #include "zf_device_camera.h" #include "zf_device_dl1a.h" #include "zf_device_dl1b.h" @@ -108,6 +108,7 @@ //====================================================应用组件层==================================================== #include "seekfree_assistant.h" +#include "seekfree_assistant_interface.h" //====================================================应用组件层==================================================== //=====================================================用户层====================================================== diff --git a/Example/E03_adc_demo/libraries/zf_common/zf_common_interrupt.c b/Example/E03_adc_demo/libraries/zf_common/zf_common_interrupt.c index 61058b2..af12fe0 100644 --- a/Example/E03_adc_demo/libraries/zf_common/zf_common_interrupt.c +++ b/Example/E03_adc_demo/libraries/zf_common/zf_common_interrupt.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_interrupt * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_common/zf_common_interrupt.h b/Example/E03_adc_demo/libraries/zf_common/zf_common_interrupt.h index 99b0e53..f828423 100644 --- a/Example/E03_adc_demo/libraries/zf_common/zf_common_interrupt.h +++ b/Example/E03_adc_demo/libraries/zf_common/zf_common_interrupt.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_interrupt * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_common/zf_common_typedef.h b/Example/E03_adc_demo/libraries/zf_common/zf_common_typedef.h index bd09f30..9a07c92 100644 --- a/Example/E03_adc_demo/libraries/zf_common/zf_common_typedef.h +++ b/Example/E03_adc_demo/libraries/zf_common/zf_common_typedef.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_typedef * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_components/seekfree_assistant.c b/Example/E03_adc_demo/libraries/zf_components/seekfree_assistant.c index a196e10..0b7cb9d 100644 --- a/Example/E03_adc_demo/libraries/zf_components/seekfree_assistant.c +++ b/Example/E03_adc_demo/libraries/zf_components/seekfree_assistant.c @@ -1,49 +1,71 @@ /********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ -#include "zf_common_fifo.h" + +#include "zf_common_debug.h" + #include "seekfree_assistant.h" -seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 -static seekfree_assistant_camera_struct seekfree_assistant_camera_data; // 图像上位机协议数据 -static seekfree_assistant_camera_dot_struct seekfree_assistant_camera_dot_data; // 图像上位机打点协议数据 -static seekfree_assistant_camera_buffer_struct seekfree_assistant_camera_buffer; // 图像以及边界缓冲区信息 -static fifo_obj_struct seekfree_assistant_fifo; -static uint8 seekfree_assistant_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE]; // 数据存放数组 -float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 保存接收到的参数 -vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 参数更新标志位 +extern uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length); +extern uint32 seekfree_assistant_receive (uint8 *buff, uint32 length); + +#if (1 == SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE) +#include "zf_common_fifo.h" +static uint8 seekfree_assistant_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE]; // FIFO缓冲区 +static fifo_struct seekfree_assistant_fifo = // FIFO结构体 +{ + .buffer = seekfree_assistant_buffer, + .execution = FIFO_IDLE, + .type = FIFO_DATA_8BIT, + .head = 0, + .end = 0, + .size = SEEKFREE_ASSISTANT_BUFFER_SIZE, + .max = SEEKFREE_ASSISTANT_BUFFER_SIZE, +}; +#endif + +static seekfree_assistant_camera_struct seekfree_assistant_camera_data; // 图像上位机协议数据 +static seekfree_assistant_camera_dot_struct seekfree_assistant_camera_dot_data; // 图像上位机打点协议数据 +static seekfree_assistant_camera_buffer_struct seekfree_assistant_camera_buffer; // 图像以及边界缓冲区信息 + +seekfree_assistant_transfer_callback_function seekfree_assistant_transfer_callback = seekfree_assistant_transfer; // 数据发送函数指针 +seekfree_assistant_receive_callback_function seekfree_assistant_receive_callback = seekfree_assistant_receive; // 数据接收函数指针 + +seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 +float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 保存接收到的参数 +vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 参数更新标志位 //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手求和函数 @@ -87,7 +109,7 @@ void seekfree_assistant_camera_data_send (seekfree_assistant_image_type_enum cam seekfree_assistant_camera_data.image_height = height; // 首先发送帧头、功能、摄像头类型、以及宽度高度等信息 - seekfree_assistant_transfer((const uint8 *)&seekfree_assistant_camera_data, sizeof(seekfree_assistant_camera_struct)); + seekfree_assistant_transfer_callback((const uint8 *)&seekfree_assistant_camera_data, sizeof(seekfree_assistant_camera_struct)); // 根据摄像头类型计算图像大小 switch(camera_type) @@ -111,9 +133,8 @@ void seekfree_assistant_camera_data_send (seekfree_assistant_image_type_enum cam // 发送图像数据 if(NULL != image_addr) { - seekfree_assistant_transfer(image_addr, image_size); + seekfree_assistant_transfer_callback(image_addr, image_size); } - } //------------------------------------------------------------------------------------------------------------------- @@ -139,16 +160,15 @@ void seekfree_assistant_camera_dot_send (seekfree_assistant_camera_buffer_struct dot_bytes *= 2; } - // 首先发送帧头、功能、边界编号、坐标长度、点个数 - seekfree_assistant_transfer((const uint8 *)&seekfree_assistant_camera_dot_data, sizeof(seekfree_assistant_camera_dot_struct)); + seekfree_assistant_transfer_callback((const uint8 *)&seekfree_assistant_camera_dot_data, sizeof(seekfree_assistant_camera_dot_struct)); for(i=0; i < SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY; i++) { // 判断是否发送横坐标数据 if(NULL != buffer->boundary_x[i]) { - seekfree_assistant_transfer((const uint8 *)buffer->boundary_x[i], dot_bytes); + seekfree_assistant_transfer_callback((const uint8 *)buffer->boundary_x[i], dot_bytes); } // 判断是否发送纵坐标数据 @@ -156,10 +176,9 @@ void seekfree_assistant_camera_dot_send (seekfree_assistant_camera_buffer_struct { // 如果没有纵坐标数据,则表示每一行只有一个边界 // 指定了横纵坐标数据,这种方式可以实现同一行多个边界的情况,例如搜线算法能够搜索出回弯。 - seekfree_assistant_transfer((const uint8 *)buffer->boundary_y[i], dot_bytes); + seekfree_assistant_transfer_callback((const uint8 *)buffer->boundary_y[i], dot_bytes); } } - } //------------------------------------------------------------------------------------------------------------------- @@ -193,7 +212,7 @@ void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struc // 数据在调用本函数之前,由用户将需要发送的数据写入seekfree_assistant_oscilloscope_data.data[] - seekfree_assistant_transfer((const uint8 *)seekfree_assistant_oscilloscope, packet_size); + seekfree_assistant_transfer_callback((const uint8 *)seekfree_assistant_oscilloscope, packet_size); } //------------------------------------------------------------------------------------------------------------------- @@ -364,12 +383,14 @@ void seekfree_assistant_camera_send (void) } } + //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手解析接收到的数据 // 参数说明 void // 返回参数 void // 使用示例 函数只需要放到周期运行的PIT中断或者主循环即可 //------------------------------------------------------------------------------------------------------------------- +#if (1 == SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE) void seekfree_assistant_data_analysis (void) { uint8 temp_sum; @@ -380,14 +401,13 @@ void seekfree_assistant_data_analysis (void) uint32 temp_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE / 4]; // 尝试读取数据, 如果不是自定义的传输方式则从接收回调中读取数据 - read_length = seekfree_assistant_receive((uint8 *)temp_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); + read_length = seekfree_assistant_receive_callback((uint8 *)temp_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); if(read_length) { // 将读取到的数据写入FIFO fifo_write_buffer(&seekfree_assistant_fifo, (uint8 *)temp_buffer, read_length); } - while(sizeof(seekfree_assistant_parameter_struct) <= fifo_used(&seekfree_assistant_fifo)) { read_length = sizeof(seekfree_assistant_parameter_struct); @@ -416,21 +436,11 @@ void seekfree_assistant_data_analysis (void) } } - // 丢弃无需使用的数据 fifo_read_buffer(&seekfree_assistant_fifo, (uint8 *)temp_buffer, &read_length, FIFO_READ_AND_CLEAN); } } - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 逐飞助手 初始化 -// 参数说明 -// 返回参数 void -// 使用示例 -//------------------------------------------------------------------------------------------------------------------- -ZF_WEAK void seekfree_assistant_init () -{ - fifo_init(&seekfree_assistant_fifo, FIFO_DATA_8BIT, seekfree_assistant_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); -} +#endif + diff --git a/Example/E03_adc_demo/libraries/zf_components/seekfree_assistant.h b/Example/E03_adc_demo/libraries/zf_components/seekfree_assistant.h index d02abb1..ae0f67c 100644 --- a/Example/E03_adc_demo/libraries/zf_components/seekfree_assistant.h +++ b/Example/E03_adc_demo/libraries/zf_components/seekfree_assistant.h @@ -1,69 +1,75 @@ -/*/********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +/********************************************************************************************************************* +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ #ifndef _seekfree_assistant_h_ #define _seekfree_assistant_h_ #include "zf_common_typedef.h" -#include "zf_common_debug.h" + + +// 1:使能参数调节的功能 0:关闭参数调节的功能 +#define SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE ( 1 ) + + // 定义接收FIFO大小 -#define SEEKFREE_ASSISTANT_BUFFER_SIZE ( 0x80 ) +#define SEEKFREE_ASSISTANT_BUFFER_SIZE ( 0x80 ) + +// 定义示波器的最大通道数量 +#define SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT ( 0x08 ) + +// 定义参数调试的最大通道数量 +#define SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT ( 0x08 ) + +// 定义图像边线最大数量 +#define SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY ( 0x08 ) + +// 单片机往上位机发送的帧头 +#define SEEKFREE_ASSISTANT_SEND_HEAD ( 0xAA ) + +// 摄像头类 +#define SEEKFREE_ASSISTANT_CAMERA_FUNCTION ( 0x02 ) +#define SEEKFREE_ASSISTANT_CAMERA_DOT_FUNCTION ( 0x03 ) +#define SEEKFREE_ASSISTANT_CAMERA_OSCILLOSCOPE ( 0x10 ) + +// 上位机往单片机发送的帧头 +#define SEEKFREE_ASSISTANT_RECEIVE_HEAD ( 0x55 ) + +// 参数设置类 +#define SEEKFREE_ASSISTANT_RECEIVE_SET_PARAMETER ( 0x20 ) -// 定义示波器的最大通道数量 -#define SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT ( 0x08 ) - -// 定义参数调试的最大通道数量 -#define SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT ( 0x08 ) - -// 定义图像边线最大数量 -#define SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY ( 0x08 ) - -// 单片机往上位机发送的帧头 -#define SEEKFREE_ASSISTANT_SEND_HEAD ( 0xAA ) - -// 摄像头类 -#define SEEKFREE_ASSISTANT_CAMERA_FUNCTION ( 0x02 ) -#define SEEKFREE_ASSISTANT_CAMERA_DOT_FUNCTION ( 0x03 ) -#define SEEKFREE_ASSISTANT_CAMERA_OSCILLOSCOPE ( 0x10 ) - -// 上位机往单片机发送的帧头 -#define SEEKFREE_ASSISTANT_RECEIVE_HEAD ( 0x55 ) - -// 参数设置类 -#define SEEKFREE_ASSISTANT_RECEIVE_SET_PARAMETER ( 0x20 ) // 摄像头类型枚举 typedef enum @@ -91,71 +97,69 @@ typedef enum typedef struct { - uint8 head; // 帧头 - uint8 channel_num; // 高四位为功能字 低四位为通道数量 - uint8 check_sum; // 和校验 - uint8 length; // 包长度 - float data[SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT]; // 通道数据 + uint8 head; // 帧头 + uint8 channel_num; // 高四位为功能字 低四位为通道数量 + uint8 check_sum; // 和校验 + uint8 length; // 包长度 + float data[SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT]; // 通道数据 }seekfree_assistant_oscilloscope_struct; typedef struct { - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 camera_type; // 低四位表示边界数量 第四位表示是否有图像数据 例如0x13:其中3表示一副图像有三条边界(通常是左边界、中线、右边界)、1表示没有图像数据 - uint8 length; // 包长度(仅包含协议部分) - uint16 image_width; // 图像宽度 - uint16 image_height; // 图像高度 -}seekfree_assistant_camera_struct; - - -typedef struct -{ - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 dot_type; // 点类型 BIT5:1:坐标是16位的 0:坐标是8位的 BIT7-BIT6:0:只有X坐标 1:只有Y坐标 2:X和Y坐标都有 BIT3-BIT0:边界数量 - uint8 length; // 包长度(仅包含协议部分) - uint16 dot_num; // 画点数量 - uint8 valid_flag; // 通道标识 - uint8 reserve; // 保留 -}seekfree_assistant_camera_dot_struct; - -typedef struct -{ - void *image_addr; // 摄像头地址 - uint16 width; // 图像宽度 - uint16 height; // 图像高度 - seekfree_assistant_image_type_enum camera_type; // 摄像头类型 - void *boundary_x[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界横坐标数组地址 - void *boundary_y[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界纵坐标数组地址 + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 camera_type; // 低四位表示边界数量 第四位表示是否有图像数据 例如0x13:其中3表示一副图像有三条边界(通常是左边界、中线、右边界)、1表示没有图像数据 + uint8 length; // 包长度(仅包含协议部分) + uint16 image_width; // 图像宽度 + uint16 image_height; // 图像高度 +}seekfree_assistant_camera_struct; + + +typedef struct +{ + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 dot_type; // 点类型 BIT5:1:坐标是16位的 0:坐标是8位的 BIT7-BIT6:0:只有X坐标 1:只有Y坐标 2:X和Y坐标都有 BIT3-BIT0:边界数量 + uint8 length; // 包长度(仅包含协议部分) + uint16 dot_num; // 画点数量 + uint8 valid_flag; // 通道标识 + uint8 reserve; // 保留 +}seekfree_assistant_camera_dot_struct; + +typedef struct +{ + void *image_addr; // 摄像头地址 + uint16 width; // 图像宽度 + uint16 height; // 图像高度 + seekfree_assistant_image_type_enum camera_type; // 摄像头类型 + void *boundary_x[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界横坐标数组地址 + void *boundary_y[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界纵坐标数组地址 }seekfree_assistant_camera_buffer_struct; typedef struct { - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 channel; // 通道 - uint8 check_sum; // 和校验 - float data; // 数据 + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 channel; // 通道 + uint8 check_sum; // 和校验 + float data; // 数据 }seekfree_assistant_parameter_struct; +typedef uint32 (*seekfree_assistant_transfer_callback_function) (const uint8 *buff, uint32 length); +typedef uint32 (*seekfree_assistant_receive_callback_function) (uint8 *buff, uint32 length); -extern seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 -extern float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 保存接收到的参数 -extern vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 参数更新标志位 +extern seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 +extern float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 保存接收到的参数 +extern vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 参数更新标志位 + + +void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struct *seekfree_assistant_oscilloscope); +void seekfree_assistant_camera_information_config (seekfree_assistant_image_type_enum camera_type, void *image_addr, uint16 width, uint16 height); +void seekfree_assistant_camera_boundary_config (seekfree_assistant_boundary_type_enum boundary_type, uint16 dot_num, void *dot_x1, void *dot_x2, void *dot_x3, void *dot_y1, void *dot_y2, void *dot_y3); +void seekfree_assistant_camera_send (void); +void seekfree_assistant_data_analysis (void); -uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length); -uint32 seekfree_assistant_receive (uint8 *buff, uint32 length); - -void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struct *seekfree_assistant_oscilloscope); - -void seekfree_assistant_camera_information_config (seekfree_assistant_image_type_enum camera_type, void *image_addr, uint16 width, uint16 height); -void seekfree_assistant_camera_boundary_config (seekfree_assistant_boundary_type_enum boundary_type, uint16 dot_num, void *dot_x1, void *dot_x2, void *dot_x3, void *dot_y1, void *dot_y2, void *dot_y3); -void seekfree_assistant_camera_send (void); - -void seekfree_assistant_data_analysis (void); -void seekfree_assistant_init (void); #endif diff --git a/Example/E03_adc_demo/libraries/zf_components/seekfree_assistant_interface.c b/Example/E03_adc_demo/libraries/zf_components/seekfree_assistant_interface.c index 99dbeef..fdade63 100644 --- a/Example/E03_adc_demo/libraries/zf_components/seekfree_assistant_interface.c +++ b/Example/E03_adc_demo/libraries/zf_components/seekfree_assistant_interface.c @@ -1,42 +1,55 @@ /********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant_interface * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ #include "zf_common_typedef.h" +#include "zf_common_fifo.h" #include "zf_common_debug.h" +#include "zf_driver_uart.h" +#include "zf_device_wireless_uart.h" +#include "zf_device_bluetooth_ch9141.h" +#include "zf_device_wifi_uart.h" +#include "zf_device_wifi_spi.h" #include "seekfree_assistant.h" +#include "seekfree_assistant_interface.h" + + +extern seekfree_assistant_transfer_callback_function seekfree_assistant_transfer_callback; // 数据发送函数指针 +extern seekfree_assistant_receive_callback_function seekfree_assistant_receive_callback; // 数据接收函数指针 + + //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手发送函数 // 参数说明 *buff 需要发送的数据地址 @@ -46,11 +59,9 @@ //------------------------------------------------------------------------------------------------------------------- ZF_WEAK uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length) { - uint32 len = 0; - - len = debug_send_buffer(buff, length); - - return len; + + // 当选择自定义通讯方式时 需要自行完成数据发送功能 + return length; } //------------------------------------------------------------------------------------------------------------------- @@ -62,11 +73,57 @@ ZF_WEAK uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length) //------------------------------------------------------------------------------------------------------------------- ZF_WEAK uint32 seekfree_assistant_receive (uint8 *buff, uint32 length) { - uint32 len = 0; + // 当选择自定义通讯方式时 需要自行完成数据接收功能 + return 0; +} - len = debug_read_ring_buffer(buff, length); - - return len; +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 逐飞助手接口 初始化 +// 参数说明 +// 返回参数 void +// 使用示例 seekfree_assistant_interface_init(SEEKFREE_ASSISTANT_WIFI_SPI); 使用高速WIFI SPI模块进行数据收发 +// 备注 需要自行调用设备的初始化,例如使用无线转串口进行数据的收发,则需要自行调用无线转串口的初始化,然后再调用seekfree_assistant_interface_init完成逐飞助手的接口初始化 +//------------------------------------------------------------------------------------------------------------------- +ZF_WEAK void seekfree_assistant_interface_init (seekfree_assistant_transfer_device_enum transfer_device) +{ + switch(transfer_device) + { + case SEEKFREE_ASSISTANT_DEBUG_UART: + { + seekfree_assistant_transfer_callback = debug_send_buffer; + seekfree_assistant_receive_callback = debug_read_ring_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIRELESS_UART: + { + seekfree_assistant_transfer_callback = wireless_uart_send_buffer; + seekfree_assistant_receive_callback = wireless_uart_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_CH9141: + { + seekfree_assistant_transfer_callback = bluetooth_ch9141_send_buffer; + seekfree_assistant_receive_callback = bluetooth_ch9141_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIFI_UART: + { + seekfree_assistant_transfer_callback = wifi_uart_send_buffer; + seekfree_assistant_receive_callback = wifi_uart_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIFI_SPI: + { + seekfree_assistant_transfer_callback = wifi_spi_send_buffer; + seekfree_assistant_receive_callback = wifi_spi_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_CUSTOM: + { + // 根据自己的需求 自行实现seekfree_assistant_transfer与seekfree_assistant_receive函数,完成数据的收发 + + }break; + } } diff --git a/Example/E03_adc_demo/libraries/zf_components/seekfree_assistant_interface.h b/Example/E03_adc_demo/libraries/zf_components/seekfree_assistant_interface.h new file mode 100644 index 0000000..940b5f7 --- /dev/null +++ b/Example/E03_adc_demo/libraries/zf_components/seekfree_assistant_interface.h @@ -0,0 +1,57 @@ +/********************************************************************************************************************* +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 +* Copyright (c) 2022 SEEKFREE 逐飞科技 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 +* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 +* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 +* +* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 +* 甚至没有隐含的适销性或适合特定用途的保证 +* 更多细节请参见 GPL +* +* 您应该在收到本开源库的同时收到一份 GPL 的副本 +* 如果没有,请参阅 +* +* 额外注明: +* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 +* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 +* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 +* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) +* +* 文件名称 seekfree_assistant_interface +* 公司名称 成都逐飞科技有限公司 +* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A +* 店铺链接 https://seekfree.taobao.com/ +* +* 修改记录 +* 日期 作者 备注 +* 2024-1-11 SeekFree first version +********************************************************************************************************************/ + +#ifndef _seekfree_assistant_interface_h_ +#define _seekfree_assistant_interface_h_ + + + +// 数据发送设备枚举 +typedef enum +{ + SEEKFREE_ASSISTANT_DEBUG_UART, // 调试串口 使用的串口由DEBUG_UART_INDEX宏定义指定 + SEEKFREE_ASSISTANT_WIRELESS_UART, // 无线转串口 + SEEKFREE_ASSISTANT_CH9141, // CH9141蓝牙 + SEEKFREE_ASSISTANT_WIFI_UART, // WIFI转串口 + SEEKFREE_ASSISTANT_WIFI_SPI, // 高速WIFI SPI + SEEKFREE_ASSISTANT_CUSTOM, // 自定义通讯方式 需要自行seekfree_assistant_transfer与seekfree_assistant_receive函数 +}seekfree_assistant_transfer_device_enum; + + +void seekfree_assistant_interface_init (seekfree_assistant_transfer_device_enum transfer_device); + + + +#endif diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_absolute_encoder.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_absolute_encoder.c index 7c80a3b..f9bc809 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_absolute_encoder.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_absolute_encoder.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_absolute_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_absolute_encoder.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_absolute_encoder.h index e6cc057..ed92906 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_absolute_encoder.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_absolute_encoder.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_absolute_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c index 500bccb..b0a06df 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_bluetooth_ch9141 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -54,7 +54,7 @@ #include "zf_device_camera.h" #include "zf_device_bluetooth_ch9141.h" -static fifo_obj_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 +static fifo_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 static uint8 bluetooth_ch9141_buffer[BLUETOOTH_CH9141_BUFFER_SIZE]; // 数据存放数组 static uint8 bluetooth_ch9141_data = 0; // 数据临时存放变量 diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h index 800be6c..ffb30b5 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h @@ -24,7 +24,7 @@ * 文件名称 main * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_camera.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_camera.c index 84c7aa0..68668c4 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_camera.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_camera.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_camera * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -45,7 +45,7 @@ #include "zf_device_camera.h" -fifo_obj_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 +fifo_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; // 定义摄像头接收数据缓冲区 uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // 定义摄像头数据发送到上位机的帧头 diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_camera.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_camera.h index 58efb06..2cd7d2d 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_camera.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_camera.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_camera * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -44,7 +44,7 @@ //=================================================摄像头公共库 基本配置================================================ #define CAMERA_RECEIVER_BUFFER_SIZE (8) // 定义摄像头接收数据缓冲区大小 -extern fifo_obj_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 +extern fifo_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 extern uint8 camera_send_image_frame_header[4]; // 声明摄像头数据发送到上位机的帧头 //=================================================摄像头公共库 基本配置================================================ diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_config.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_config.h index af6a3d8..6c8147d 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_config.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_config.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_config * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_dl1a.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_dl1a.c index 3e7410c..27be3a7 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_dl1a.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_dl1a.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1a * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_dl1a.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_dl1a.h index 89145d3..3176dd3 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_dl1a.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_dl1a.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1a * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_dl1b.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_dl1b.c index 90e64b3..96e472e 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_dl1b.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_dl1b.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1b * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_dl1b.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_dl1b.h index b144739..922b3ce 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_dl1b.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_dl1b.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1b * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_gps_tau1201.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_gnss.c similarity index 60% rename from Example/E02_uart_demo/libraries/zf_device/zf_device_gps_tau1201.c rename to Example/E03_adc_demo/libraries/zf_device/zf_device_gnss.c index da46a99..caf7cd0 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_gps_tau1201.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_gnss.c @@ -21,27 +21,26 @@ * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) * -* 文件名称 zf_device_gps_tau1201 +* 文件名称 zf_device_gnss * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * * 修改记录 -* 日期 作者 备注 -* 2022-09-15 pudding first version -* 2023-04-28 pudding 增加中文注释说明 +* 日期 作者 备注 +* 2023-12-28 pudding first version ********************************************************************************************************************/ -/******************************************************************************************************************** +/********************************************************************************************************************* * 接线定义: -* ------------------------------------ -* 模块管脚 单片机管脚 -* RX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_RX 宏定义 -* TX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_TX 宏定义 -* VCC 3.3V电源 -* GND 电源地 -* ------------------------------------ +* ------------------------------------ +* 模块管脚 单片机管脚 +* RX 查看 zf_device_gnss.h 中 GNSS_RX 宏定义 +* TX 查看 zf_device_gnss.h 中 GNSS_TX 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* ------------------------------------ ********************************************************************************************************************/ #include "math.h" @@ -50,22 +49,24 @@ #include "zf_driver_delay.h" #include "zf_driver_uart.h" -#include "zf_device_gps_tau1201.h" +#include "zf_device_gnss.h" -#define GPS_TAU1201_BUFFER_SIZE ( 128 ) +#define GNSS_BUFFER_SIZE ( 128 ) -uint8 gps_tau1201_flag = 0; // 1:采集完成等待处理数据 0:没有采集完成 -gps_info_struct gps_tau1201; // GPS解析之后的数据 +uint8 gnss_flag = 0; // 1:采集完成等待处理数据 0:没有采集完成 +gnss_info_struct gnss; // GPS解析之后的数据 + +static uint8 gnss_state = 0; // 1:GPS初始化完成 +static fifo_struct gnss_receiver_fifo; // +static uint8 gnss_receiver_buffer[GNSS_BUFFER_SIZE]; // 数据存放数组 -static uint8 gps_tau1201_state = 0; // 1:GPS初始化完成 -static fifo_obj_struct gps_tau1201_receiver_fifo; // -static uint8 gps_tau1201_receiver_buffer[GPS_TAU1201_BUFFER_SIZE]; // 数据存放数组 +static gps_state_enum gnss_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 +static gps_state_enum gnss_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 +static gps_state_enum gnss_ths_state = GPS_STATE_RECEIVING; // rmc 语句状态 -gps_state_enum gps_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 -gps_state_enum gps_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 - -static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; // GGA语句缓冲区 -static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; // RMC语句缓冲区 +static uint8 gps_gga_buffer[GNSS_BUFFER_SIZE]; +static uint8 gps_rmc_buffer[GNSS_BUFFER_SIZE]; +static uint8 gps_ths_buffer[GNSS_BUFFER_SIZE]; //------------------------------------------------------------------------------------------------------------------- // 函数简介 获取指定 ',' 后面的索引 @@ -94,7 +95,7 @@ static uint8 get_parameter_index (uint8 num, char *str) } if(j == num) { - len1 = i + 1; + len1 = i + 1; break; } } @@ -121,7 +122,7 @@ static int get_int_number (char *s) return_value = func_str_to_int(buf); return return_value; } - + //------------------------------------------------------------------------------------------------------------------- // 函数简介 给定字符串第一个 ',' 之前的数据转换为float // 参数说明 *s 字符串 @@ -134,15 +135,15 @@ static float get_float_number (char *s) uint8 i = 0; char buf[15]; float return_value = 0; - + i = get_parameter_index(1, s); i = i - 1; strncpy(buf, s, i); buf[i] = 0; return_value = (float)func_str_to_double(buf); - return return_value; + return return_value; } - + //------------------------------------------------------------------------------------------------------------------- // 函数简介 给定字符串第一个 ',' 之前的数据转换为double // 参数说明 *s 字符串 @@ -155,7 +156,7 @@ static double get_double_number (char *s) uint8 i = 0; char buf[15]; double return_value = 0; - + i = get_parameter_index(1, s); i = i - 1; strncpy(buf, s, i); @@ -168,13 +169,13 @@ static double get_double_number (char *s) // 函数简介 世界时间转换为北京时间 // 参数说明 *time 保存的时间 // 返回参数 void -// 使用示例 utc_to_btc(&gps->time); +// 使用示例 utc_to_btc(&gnss->time); // 备注信息 内部使用 //------------------------------------------------------------------------------------------------------------------- static void utc_to_btc (gps_time_struct *time) { uint8 day_num = 0; - + time->hour = time->hour + 8; if(23 < time->hour) { @@ -197,7 +198,7 @@ static void utc_to_btc (gps_time_struct *time) day_num = 30; } } - + if(time->day > day_num) { time->day = 1; @@ -214,18 +215,18 @@ static void utc_to_btc (gps_time_struct *time) //------------------------------------------------------------------------------------------------------------------- // 函数简介 RMC语句解析 // 参数说明 *line 接收到的语句信息 -// 参数说明 *gps 保存解析后的数据 +// 参数说明 *gnss 保存解析后的数据 // 返回参数 uint8 1:解析成功 0:数据有问题不能解析 -// 使用示例 gps_gnrmc_parse((char *)data_buffer, &gps_tau1201); +// 使用示例 gps_gnrmc_parse((char *)data_buffer, &gnss); // 备注信息 内部使用 //------------------------------------------------------------------------------------------------------------------- -static uint8 gps_gnrmc_parse (char *line, gps_info_struct *gps) +static uint8 gps_gnrmc_parse (char *line, gnss_info_struct *gnss) { uint8 state = 0, temp = 0; - + double latitude = 0; // 纬度 double longitude = 0; // 经度 - + double lati_cent_tmp = 0, lati_second_tmp = 0; double long_cent_tmp = 0, long_second_tmp = 0; float speed_tmp = 0; @@ -234,47 +235,50 @@ static uint8 gps_gnrmc_parse (char *line, gps_info_struct *gps) state = buf[get_parameter_index(2, buf)]; - gps->state = 0; if('A' == state) // 如果数据有效 则解析数据 { return_state = 1; - gps->state = 1; - gps -> ns = buf[get_parameter_index(4, buf)]; - gps -> ew = buf[get_parameter_index(6, buf)]; + gnss->state = 1; + gnss -> ns = buf[get_parameter_index(4, buf)]; + gnss -> 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; // 纬度转换为度分秒 - lati_cent_tmp = (latitude - gps->latitude_degree * 100); - gps->latitude_cent = (int)lati_cent_tmp; - lati_second_tmp = (lati_cent_tmp - gps->latitude_cent) * 6000; - gps->latitude_second = (int)lati_second_tmp; + gnss->latitude_degree = (int)latitude / 100; // 纬度转换为度分秒 + lati_cent_tmp = (latitude - gnss->latitude_degree * 100); + gnss->latitude_cent = (int)lati_cent_tmp; + lati_second_tmp = (lati_cent_tmp - gnss->latitude_cent) * 6000; + gnss->latitude_second = (int)lati_second_tmp; - gps->longitude_degree = (int)longitude / 100; // 经度转换为度分秒 - long_cent_tmp = (longitude - gps->longitude_degree * 100); - gps->longitude_cent = (int)long_cent_tmp; - long_second_tmp = (long_cent_tmp - gps->longitude_cent) * 6000; - gps->longitude_second = (int)long_second_tmp; + gnss->longitude_degree = (int)longitude / 100; // 经度转换为度分秒 + long_cent_tmp = (longitude - gnss->longitude_degree * 100); + gnss->longitude_cent = (int)long_cent_tmp; + long_second_tmp = (long_cent_tmp - gnss->longitude_cent) * 6000; + gnss->longitude_second = (int)long_second_tmp; - gps->latitude = gps->latitude_degree + lati_cent_tmp / 60; - gps->longitude = gps->longitude_degree + long_cent_tmp / 60; + gnss->latitude = gnss->latitude_degree + lati_cent_tmp / 60; + gnss->longitude = gnss->longitude_degree + long_cent_tmp / 60; speed_tmp = get_float_number(&buf[get_parameter_index(7, buf)]); // 速度(海里/小时) - gps->speed = speed_tmp * 1.85f; // 转换为公里/小时 - gps->direction = get_float_number(&buf[get_parameter_index(8, buf)]); // 角度 + gnss->speed = speed_tmp * 1.85f; // 转换为公里/小时 + gnss->direction = get_float_number(&buf[get_parameter_index(8, buf)]); // 角度 + } + else + { + gnss->state = 0; } // 在定位没有生效前也是有时间数据的,可以直接解析 - gps->time.hour = (buf[7] - '0') * 10 + (buf[8] - '0'); // 时间 - gps->time.minute = (buf[9] - '0') * 10 + (buf[10] - '0'); - gps->time.second = (buf[11] - '0') * 10 + (buf[12] - '0'); + gnss->time.hour = (buf[7] - '0') * 10 + (buf[8] - '0'); // 时间 + gnss->time.minute = (buf[9] - '0') * 10 + (buf[10] - '0'); + gnss->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'); // 日期 - 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; + gnss->time.day = (buf[temp + 0] - '0') * 10 + (buf[temp + 1] - '0'); // 日期 + gnss->time.month = (buf[temp + 2] - '0') * 10 + (buf[temp + 3] - '0'); + gnss->time.year = (buf[temp + 4] - '0') * 10 + (buf[temp + 5] - '0') + 2000; - utc_to_btc(&gps->time); + utc_to_btc(&gnss->time); return return_state; } @@ -282,12 +286,12 @@ static uint8 gps_gnrmc_parse (char *line, gps_info_struct *gps) //------------------------------------------------------------------------------------------------------------------- // 函数简介 GGA语句解析 // 参数说明 *line 接收到的语句信息 -// 参数说明 *gps 保存解析后的数据 +// 参数说明 *gnss 保存解析后的数据 // 返回参数 uint8 1:解析成功 0:数据有问题不能解析 -// 使用示例 gps_gngga_parse((char *)data_buffer, &gps_tau1201); +// 使用示例 gps_gngga_parse((char *)data_buffer, &gnss); // 备注信息 内部使用 //------------------------------------------------------------------------------------------------------------------- -static uint8 gps_gngga_parse (char *line, gps_info_struct *gps) +static uint8 gps_gngga_parse (char *line, gnss_info_struct *gnss) { uint8 state = 0; char *buf = line; @@ -297,11 +301,41 @@ static uint8 gps_gngga_parse (char *line, gps_info_struct *gps) 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)]); // 高度 = 海拔高度 + 地球椭球面相对大地水准面的高度 + gnss->satellite_used = (uint8)get_int_number(&buf[get_parameter_index(7, buf)]); + gnss->height = get_float_number(&buf[get_parameter_index(9, buf)]) + get_float_number(&buf[get_parameter_index(11, buf)]); // 高度 = 海拔高度 + 地球椭球面相对大地水准面的高度 return_state = 1; } + + return return_state; +} +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 THS语句解析 +// 参数说明 *line 接收到的语句信息 +// 参数说明 *gnss 保存解析后的数据 +// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 +// 使用示例 gps_gnths_parse((char *)data_buffer, &gnss); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 gps_gnths_parse (char *line, gnss_info_struct *gnss) +{ + uint8 state = 0; + char *buf = line; + uint8 return_state = 0; + + state = buf[get_parameter_index(2, buf)]; + + if('A' == state) + { + gnss->antenna_direction_state = 1; + gnss->antenna_direction = get_float_number(&buf[get_parameter_index(1, buf)]); + return_state = 1; + } + else + { + gnss->antenna_direction_state = 0; + } + return return_state; } @@ -316,7 +350,7 @@ static uint8 gps_gngga_parse (char *line, gps_info_struct *gps) // 备注信息 //------------------------------------------------------------------------------------------------------------------- double get_two_points_distance (double latitude1, double longitude1, double latitude2, double longitude2) -{ +{ const double EARTH_RADIUS = 6378137; // 地球半径(单位:m) double rad_latitude1 = 0; double rad_latitude2 = 0; @@ -325,7 +359,7 @@ double get_two_points_distance (double latitude1, double longitude1, double lati double distance = 0; double a = 0; double b = 0; - + rad_latitude1 = ANGLE_TO_RAD(latitude1); // 根据角度计算弧度 rad_latitude2 = ANGLE_TO_RAD(latitude2); rad_longitude1 = ANGLE_TO_RAD(longitude1); @@ -335,9 +369,9 @@ double get_two_points_distance (double latitude1, double longitude1, double lati 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 里面实现的算法 - distance = distance * EARTH_RADIUS; + distance = distance * EARTH_RADIUS; - return distance; + return distance; } //------------------------------------------------------------------------------------------------------------------- @@ -370,7 +404,7 @@ double get_two_points_azimuth (double latitude1, double longitude1, double latit // 使用示例 gps_data_parse(); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint8 gps_data_parse (void) +uint8 gnss_data_parse (void) { uint8 return_state = 0; uint8 check_buffer[5] = {'0', 'x', 0x00, 0x00, 0x00}; @@ -380,9 +414,9 @@ uint8 gps_data_parse (void) do { - if(GPS_STATE_RECEIVED == gps_rmc_state) + if(GPS_STATE_RECEIVED == gnss_rmc_state) { - gps_rmc_state = GPS_STATE_PARSING; + gnss_rmc_state = GPS_STATE_PARSING; strncpy((char *)&check_buffer[2], strchr((const char *)gps_rmc_buffer, '*') + 1, 2); bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); for(bbc_xor_calculation = gps_rmc_buffer[1], data_len = 2; '*' != gps_rmc_buffer[data_len]; data_len ++) @@ -395,17 +429,17 @@ uint8 gps_data_parse (void) return_state = 1; break; } - - gps_gnrmc_parse((char *)gps_rmc_buffer, &gps_tau1201); + + gps_gnrmc_parse((char *)gps_rmc_buffer, &gnss); } - gps_rmc_state = GPS_STATE_RECEIVING; - - if(GPS_STATE_RECEIVED == gps_gga_state) + gnss_rmc_state = GPS_STATE_RECEIVING; + + if(GPS_STATE_RECEIVED == gnss_gga_state) { - gps_gga_state = GPS_STATE_PARSING; + gnss_gga_state = GPS_STATE_PARSING; strncpy((char *)&check_buffer[2], strchr((const char *)gps_gga_buffer, '*') + 1, 2); bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); - + for(bbc_xor_calculation = gps_gga_buffer[1], data_len = 2; '*' != gps_gga_buffer[data_len]; data_len ++) { bbc_xor_calculation ^= gps_gga_buffer[data_len]; @@ -416,11 +450,32 @@ uint8 gps_data_parse (void) return_state = 1; break; } - - gps_gngga_parse((char *)gps_gga_buffer, &gps_tau1201); + + gps_gngga_parse((char *)gps_gga_buffer, &gnss); } - gps_gga_state = GPS_STATE_RECEIVING; - + gnss_gga_state = GPS_STATE_RECEIVING; + + if(GPS_STATE_RECEIVED == gnss_ths_state) + { + gnss_ths_state = GPS_STATE_PARSING; + strncpy((char *)&check_buffer[2], strchr((const char *)gps_ths_buffer, '*') + 1, 2); + bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); + + for(bbc_xor_calculation = gps_ths_buffer[1], data_len = 2; '*' != gps_ths_buffer[data_len]; data_len ++) + { + bbc_xor_calculation ^= gps_ths_buffer[data_len]; + } + if(bbc_xor_calculation != bbc_xor_origin) + { + // 数据校验失败 + return_state = 1; + break; + } + + gps_gnths_parse((char *)gps_ths_buffer, &gnss); + } + gnss_ths_state = GPS_STATE_RECEIVING; + }while(0); return return_state; } @@ -433,51 +488,64 @@ uint8 gps_data_parse (void) // 使用示例 gps_uart_callback(); // 备注信息 此函数需要在串口接收中断内进行调用 //------------------------------------------------------------------------------------------------------------------- -void gps_uart_callback (void) +void gnss_uart_callback (void) { uint8 temp_gps[6]; uint32 temp_length = 0; - if(gps_tau1201_state) + + + + if(gnss_state) { uint8 dat; - while(uart_query_byte(GPS_TAU1201_UART, &dat)) + while(uart_query_byte(GNSS_UART, &dat)) { - fifo_write_buffer(&gps_tau1201_receiver_fifo, &dat, 1); + fifo_write_buffer(&gnss_receiver_fifo, &dat, 1); } - + if('\n' == dat) { // 读取前6个数据 用于判断语句类型 temp_length = 6; - fifo_read_buffer(&gps_tau1201_receiver_fifo, temp_gps, &temp_length, FIFO_READ_ONLY); - + fifo_read_buffer(&gnss_receiver_fifo, temp_gps, &temp_length, FIFO_READ_ONLY); + // 根据不同类型将数据拷贝到不同的缓冲区 if(0 == strncmp((char *)&temp_gps[3], "RMC", 3)) { // 如果没有在解析数据则更新缓冲区的数据 - if(GPS_STATE_PARSING != gps_rmc_state) + if(GPS_STATE_PARSING != gnss_rmc_state) { - gps_rmc_state = GPS_STATE_RECEIVED; - temp_length = fifo_used(&gps_tau1201_receiver_fifo); - fifo_read_buffer(&gps_tau1201_receiver_fifo, gps_rmc_buffer, &temp_length, FIFO_READ_AND_CLEAN); + gnss_rmc_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_rmc_buffer, &temp_length, FIFO_READ_AND_CLEAN); } } else if(0 == strncmp((char *)&temp_gps[3], "GGA", 3)) { // 如果没有在解析数据则更新缓冲区的数据 - if(GPS_STATE_PARSING != gps_gga_state) + if(GPS_STATE_PARSING != gnss_gga_state) { - gps_gga_state = GPS_STATE_RECEIVED; - temp_length = fifo_used(&gps_tau1201_receiver_fifo); - fifo_read_buffer(&gps_tau1201_receiver_fifo, gps_gga_buffer, &temp_length, FIFO_READ_AND_CLEAN); + gnss_gga_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_gga_buffer, &temp_length, FIFO_READ_AND_CLEAN); } } - + else if(0 == strncmp((char *)&temp_gps[3], "THS", 3)) + { + // 如果没有在解析数据则更新缓冲区的数据 + if(GPS_STATE_PARSING != gnss_ths_state) + { + gnss_ths_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_ths_buffer, &temp_length, FIFO_READ_AND_CLEAN); + } + } + // 统一将FIFO清空 - fifo_clear(&gps_tau1201_receiver_fifo); + fifo_clear(&gnss_receiver_fifo); - gps_tau1201_flag = 1; + gnss_flag = 1; } } } @@ -489,12 +557,12 @@ void gps_uart_callback (void) // 使用示例 gps_init(); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -void gps_init (void) +void gnss_init (gps_device_enum gps_device) { 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}; @@ -504,38 +572,49 @@ void gps_init (void) 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}; + + if((TAU1201 == gps_device) || (GN42A == gps_device)) + { + fifo_init(&gnss_receiver_fifo, FIFO_DATA_8BIT, gnss_receiver_buffer, GNSS_BUFFER_SIZE); + system_delay_ms(500); // 等待GPS启动后开始初始化 + uart_init(GNSS_UART, 115200, GNSS_RX, GNSS_TX); - fifo_init(&gps_tau1201_receiver_fifo, FIFO_DATA_8BIT, gps_tau1201_receiver_buffer, GPS_TAU1201_BUFFER_SIZE); - system_delay_ms(500); // 等待GPS启动后开始初始化 - uart_init(GPS_TAU1201_UART, 115200, GPS_TAU1201_RX, GPS_TAU1201_TX); - uart_rx_interrupt(GPS_TAU1201_UART, 0); + uart_write_buffer(GNSS_UART, (uint8 *)set_rate, sizeof(set_rate)); // 设置GPS更新速率为10hz 如果不调用此语句则默认为1hz + system_delay_ms(200); + + uart_write_buffer(GNSS_UART, (uint8 *)open_rmc, sizeof(open_rmc)); // 开启rmc语句 + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)open_gga, sizeof(open_gga)); // 开启gga语句 + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gll, sizeof(close_gll)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gsa, sizeof(close_gsa)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_grs, sizeof(close_grs)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gsv, sizeof(close_gsv)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_vtg, sizeof(close_vtg)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_zda, sizeof(close_zda)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gst, sizeof(close_gst)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_txt, sizeof(close_txt)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_txt_ant, sizeof(close_txt_ant)); + system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)set_rate, sizeof(set_rate)); // 设置GPS更新速率为10hz 如果不调用此语句则默认为1hz - system_delay_ms(200); - - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)open_rmc, sizeof(open_rmc)); // 开启rmc语句 - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)open_gga, sizeof(open_gga)); // 开启gga语句 - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gll, sizeof(close_gll)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gsa, sizeof(close_gsa)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_grs, sizeof(close_grs)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gsv, sizeof(close_gsv)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_vtg, sizeof(close_vtg)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_zda, sizeof(close_zda)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gst, sizeof(close_gst)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_txt, sizeof(close_txt)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_txt_ant, sizeof(close_txt_ant)); - system_delay_ms(50); - - gps_tau1201_state = 1; - uart_rx_interrupt(GPS_TAU1201_UART, 1); + gnss_state = 1; + uart_rx_interrupt(GNSS_UART, 1); + } + else if(GN43RFA == gps_device) + { + // GN43RFA RTK模块不需要进行参数设置,如果需要修改参数应该使用专用的上位机修改参数 + fifo_init(&gnss_receiver_fifo, FIFO_DATA_8BIT, gnss_receiver_buffer, GNSS_BUFFER_SIZE); + uart_init(GNSS_UART, 115200, GNSS_RX, GNSS_TX); + gnss_state = 1; + uart_rx_interrupt(GNSS_UART, 1); + } + } diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_gnss.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_gnss.h new file mode 100644 index 0000000..5d58976 --- /dev/null +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_gnss.h @@ -0,0 +1,125 @@ +/********************************************************************************************************************* +* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* Copyright (c) 2022 SEEKFREE 逐飞科技 +* +* 本文件是 TC264 开源库的一部分 +* +* TC264 开源库 是免费软件 +* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 +* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 +* +* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 +* 甚至没有隐含的适销性或适合特定用途的保证 +* 更多细节请参见 GPL +* +* 您应该在收到本开源库的同时收到一份 GPL 的副本 +* 如果没有,请参阅 +* +* 额外注明: +* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 +* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 +* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 +* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) +* +* 文件名称 zf_device_gnss +* 公司名称 成都逐飞科技有限公司 +* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 +* 开发环境 ADS v1.9.20 +* 适用平台 TC264D +* 店铺链接 https://seekfree.taobao.com/ +* +* 修改记录 +* 日期 作者 备注 +* 2023-12-28 pudding first version +********************************************************************************************************************/ +/********************************************************************************************************************* +* 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* RX 查看 zf_device_gnss.h 中 GNSS_RX 宏定义 +* TX 查看 zf_device_gnss.h 中 GNSS_TX 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* ------------------------------------ +********************************************************************************************************************/ + +#ifndef _zf_device_gnss_h_ +#define _zf_device_gnss_h_ + +#include "zf_common_typedef.h" + +//-------------------------------------------------------------------------------------------------- +//引脚配置 +//-------------------------------------------------------------------------------------------------- +#define GNSS_UART (UART_3) +#define GNSS_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 +#define GNSS_TX (UART3_RX_P15_7) // GPS TX串口引脚 + +#define ANGLE_TO_RAD(x) ( (x) * PI / 180.0 ) // 角度转换为弧度 +#define RAD_TO_ANGLE(x) ( (x) * 180.0 / PI ) // 弧度转换为角度 +#define PI ( 3.1415926535898 ) + +typedef enum +{ + TAU1201 = 1, // 逐飞科技双频GPS模块 + GN42A = 1, // 逐飞科技双频GPS模块 与TAU1201是一样的 + GN43RFA = 2, // 逐飞科技三频RTK模块 +}gps_device_enum; + +typedef struct +{ + uint16 year; + uint8 month; + uint8 day; + uint8 hour; + uint8 minute; + uint8 second; +}gps_time_struct; + +typedef struct +{ + gps_time_struct time; // 时间 + + uint8 state; // 有效状态 1:定位有效 0:定位无效 + + uint16 latitude_degree; // 度 + uint16 latitude_cent; // 分 + uint16 latitude_second; // 秒 这里的秒是被放大了100倍的,主要是避免使用浮点数 + uint16 longitude_degree; // 度 + uint16 longitude_cent; // 分 + uint16 longitude_second; // 秒 这里的秒是被放大了100倍的,主要是避免使用浮点数 + + double latitude; // 纬度 + double longitude; // 经度 + + int8 ns; // 纬度半球 N(北半球)或 S(南半球) + int8 ew; // 经度半球 E(东经)或 W(西经) + + float speed; // 速度(公里/每小时) + float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准)+ + uint8 antenna_direction_state; // 双天线测向有效状态 1:测向有效 0:测向无效,无效时antenna_direction数据是无效的 + float antenna_direction; // 主天线指向从天线与真北构成的夹角(000.0~359.9 度) + + // 下面两个个信息从GNGGA语句中获取 + uint8 satellite_used; // 用于定位的卫星数量 + float height; // 高度 +}gnss_info_struct; + +typedef enum +{ + GPS_STATE_RECEIVING, // 正在接收数据 + GPS_STATE_RECEIVED, // 数据接收完成 + GPS_STATE_PARSING, // 正在解析 +}gps_state_enum; + +extern gnss_info_struct gnss; +extern uint8 gnss_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); +uint8 gnss_data_parse (void); +void gnss_uart_callback (void); +void gnss_init (gps_device_enum gps_device); + +#endif diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_gps_tau1201.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_gps_tau1201.h deleted file mode 100644 index c167bae..0000000 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_gps_tau1201.h +++ /dev/null @@ -1,117 +0,0 @@ -/********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 -* Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 -* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 -* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* -* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 -* 甚至没有隐含的适销性或适合特定用途的保证 -* 更多细节请参见 GPL -* -* 您应该在收到本开源库的同时收到一份 GPL 的副本 -* 如果没有,请参阅 -* -* 额外注明: -* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 -* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 -* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 -* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* -* 文件名称 zf_device_gps_tau1201 -* 公司名称 成都逐飞科技有限公司 -* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D -* 店铺链接 https://seekfree.taobao.com/ -* -* 修改记录 -* 日期 作者 备注 -* 2022-09-15 pudding first version -* 2023-04-28 pudding 增加中文注释说明 -********************************************************************************************************************/ -/******************************************************************************************************************** -* 接线定义: -* ------------------------------------ -* 模块管脚 单片机管脚 -* RX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_RX 宏定义 -* TX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_TX 宏定义 -* VCC 3.3V电源 -* GND 电源地 -* ------------------------------------ -********************************************************************************************************************/ - -#ifndef _zf_device_gps_tau1201_h_ -#define _zf_device_gps_tau1201_h_ - -#include "zf_common_typedef.h" - -//=================================================定义 定位模块 基本配置================================================ -#define GPS_TAU1201_UART (UART_3) -#define GPS_TAU1201_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 -#define GPS_TAU1201_TX (UART3_RX_P15_7) // GPS TX串口引脚 - -#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 -#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 -#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; // 时间- - uint8 state; // 有效状态 1:定位有效 0:定位无效 - uint16 latitude_degree; // 度 - uint16 latitude_cent; // 分 - uint16 latitude_second; // 秒 - uint16 longitude_degree; // 度 - uint16 longitude_cent; // 分 - uint16 longitude_second; // 秒 - double latitude; // 纬度 - double longitude; // 经度 - int8 ns; // 纬度半球 N(北半球)或 S(南半球) - int8 ew; // 经度半球 E(东经)或 W(西经) - float speed; // 速度(公里/每小时) - float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) - // 下面两个个信息从GNGGA语句中获取 - uint8 satellite_used; // 用于定位的卫星数量 - float height; // 高度 -}gps_info_struct; - -typedef enum -{ - GPS_STATE_RECEIVING, // 正在接收数据 - GPS_STATE_RECEIVED, // 数据接收完成 - GPS_STATE_PARSING, // 正在解析 -}gps_state_enum; -//================================================定义 定位模块 参数结构体================================================ - - -//=================================================声明 定位模块 全局变量================================================ -extern gps_info_struct gps_tau1201; // GPS解析之后的数据 -extern uint8 gps_tau1201_flag; // 1:采集完成等待处理数据 0:没有采集完成 -//=================================================声明 定位模块 全局变量================================================ - - -//=================================================声明 定位模块 基础函数================================================ -double get_two_points_distance (double lat1, double lng1, double lat2, double lng2); // 计算从第一个点到第二个点的距离(单位:m) -double get_two_points_azimuth (double lat1, double lon1, double lat2, double lon2); // 计算从第一个点到第二个点的方位角(单位:°) -uint8 gps_data_parse (void); // 解析GPS数据 -void gps_uart_callback (void); // GPS回调函数 -void gps_init (void); // GPS初始化 -//=================================================声明 定位模块 基础函数================================================ -#endif diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_icm20602.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_icm20602.c index f4ae830..ddebf3c 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_icm20602.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_icm20602.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_icm20602 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_icm20602.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_icm20602.h index 67724ad..209972b 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_icm20602.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_icm20602.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_icm20602 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_imu660ra.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_imu660ra.c index 95144f9..02fdb9e 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_imu660ra.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_imu660ra.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu660ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_imu660ra.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_imu660ra.h index a689df1..348e6a1 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_imu660ra.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_imu660ra.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu660ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_imu963ra.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_imu963ra.c index 92ec0f6..595142a 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_imu963ra.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_imu963ra.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu963ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_imu963ra.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_imu963ra.h index 4d0d9f9..c0f981f 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_imu963ra.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_imu963ra.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu963ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_ips114.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_ips114.c index 78c6f3b..b13e338 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_ips114.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_ips114.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips114 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_ips114.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_ips114.h index 81dfc3c..ba932b1 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_ips114.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_ips114.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips114 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_ips200.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_ips200.c index cd8681f..37d9d04 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_ips200.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_ips200.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips200 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_ips200.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_ips200.h index ce59927..045bf27 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_ips200.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_ips200.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips200 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_key.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_key.c index 9e42c8a..8b240cb 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_key.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_key.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_key * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_key.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_key.h index bcab8aa..9c653cf 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_key.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_key.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_key * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_mpu6050.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_mpu6050.c index dc3c5b2..101a5ae 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_mpu6050.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_mpu6050.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_mpu6050 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_mpu6050.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_mpu6050.h index 3510e06..c8a086f 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_mpu6050.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_mpu6050.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_mpu6050 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_mt9v03x.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_mt9v03x.c index 231cfec..d38b8df 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_mt9v03x.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_mt9v03x.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_mt9v03x * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_mt9v03x.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_mt9v03x.h index 7786bc5..9d4650d 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_mt9v03x.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_mt9v03x.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_mt9v03x * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_oled.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_oled.c index 5314209..55aefa7 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_oled.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_oled.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_oled * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_oled.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_oled.h index d52d2fd..aadf048 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_oled.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_oled.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_oled * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_ov7725.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_ov7725.c index 12f6095..bac95fe 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_ov7725.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_ov7725.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ov7725 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_ov7725.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_ov7725.h index f45a4e8..2cb4026 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_ov7725.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_ov7725.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ov7725 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_scc8660.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_scc8660.c index 3483c93..38d65ff 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_scc8660.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_scc8660.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_scc8660 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_scc8660.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_scc8660.h index 815d272..537283a 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_scc8660.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_scc8660.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_scc8660 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_tft180.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_tft180.c index db50824..b661e91 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_tft180.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_tft180.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_tft180 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_tft180.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_tft180.h index 47491ee..54a72b3 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_tft180.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_tft180.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_tft180 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_tsl1401.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_tsl1401.c index 3f9db7f..d133c7c 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_tsl1401.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_tsl1401.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_tsl1401 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_tsl1401.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_tsl1401.h index 1fab12e..a7b061c 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_tsl1401.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_tsl1401.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_tsl1401 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_type.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_type.c index 497ba55..af24701 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_type.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_type.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_type * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -32,6 +32,7 @@ * 日期 作者 备注 * 2022-09-15 pudding first version * 2023-05-26 pudding 新增SPI WIFI 中断回调指针 +* 2024-01-16 pudding 移除SPI WIFI 中断回调指针 SPI WIFI将不再使用外部 ********************************************************************************************************************/ #include "zf_device_type.h" @@ -45,7 +46,6 @@ callback_function camera_dma_handler = type_default_callback; wireless_type_enum wireless_type = NO_WIRELESS; callback_function wireless_module_uart_handler = type_default_callback; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 -callback_function wireless_module_spi_handler = type_default_callback; // WIFI SPI GPIO中断函数指针,根据初始化时设置的函数进行跳转 tof_type_enum tof_type = NO_TOF; callback_function tof_module_exti_handler = type_default_callback; // ToF 模块 INT 更新中断 @@ -54,7 +54,7 @@ callback_function tof_module_exti_handler = type_default_callback; // 函数简介 默认回调函数 // 参数说明 void // 返回参数 void -// 使用示例 +// 使用示例 // 备注信息 保护性冗余设计 防止在没有初始化设备的时候跑飞 //------------------------------------------------------------------------------------------------------------------- static void type_default_callback (void) @@ -90,14 +90,7 @@ void set_camera_type (camera_type_enum type_set, callback_function vsync_callba void set_wireless_type (wireless_type_enum type_set, callback_function wireless_callback) { wireless_type = type_set; - if(WIFI_SPI == wireless_type) - { - wireless_module_spi_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); - } - else - { - wireless_module_uart_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); - } + wireless_module_uart_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); } //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_type.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_type.h index 19c36ca..3b124fe 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_type.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_type.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_type * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -56,7 +56,6 @@ typedef enum WIRELESS_UART, // 无线串口 BLUETOOTH_CH9141, // 蓝牙 CH9141 WIFI_UART, // 串口 WiFi - WIFI_SPI // SPI WiFi }wireless_type_enum; typedef enum diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c index 2bdb164..3cbc786 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_virtual_oscilloscope * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h index f518026..b0fd085 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_virtual_oscilloscope * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_wifi_spi.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_wifi_spi.c index 78a6d68..f9e51ca 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_wifi_spi.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_wifi_spi.c @@ -24,14 +24,13 @@ * 文件名称 zf_device_wifi_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 * 日期 作者 备注 -* 2023-05-27 pudding first version -* 2023-05-29 pudding 新增关闭休眠指令,提升通讯效率 +* 2022-09-21 SeekFree first version ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,1374 +52,615 @@ #include "zf_common_clock.h" #include "zf_common_debug.h" #include "zf_common_fifo.h" -#include "zf_common_function.h" #include "zf_driver_delay.h" #include "zf_driver_gpio.h" -#include "zf_common_interrupt.h" -#include "zf_driver_exti.h" #include "zf_driver_spi.h" #include "zf_device_type.h" #include "zf_device_wifi_spi.h" -#define WAIT_TIME_OUT (10000) // 单指令等待时间 单位:ms +#define WIFI_CONNECT_TIME_OUT 10000 // 单位毫秒 +#define SOCKET_CONNECT_TIME_OUT 50000 // 单位毫秒 +#define OTHER_TIME_OUT 1000 // 单位毫秒 -#define WIFI_SPI_WRITE_MAX 128 // 定义一次SPI通讯最大发送的数据长度 - -#define WIFI_SPI_WRITE_REQUEST 0x01 -#define WIFI_SPI_CHECK_STATE 0x02 -#define WIFI_SPI_WRITE_DATA 0x03 -#define WIFI_SPI_READ_DATA 0x04 -#define WIFI_SPI_WRITE_END 0x07 -#define WIFI_SPI_READ_END 0x08 - -#define WIFI_SPI_WRITE_ADDR 0x00 -#define WIFI_SPI_STATE_ADDR 0x04 +char wifi_spi_version[12]; // 保存模块固件版本信息 +char wifi_spi_mac_addr[20]; // 保存模块MAC地址信息 +char wifi_spi_ip_addr_port[25]; // 保存模块IP地址与端口信息 -volatile wifi_spi_buffer_state_enum wifi_buffer_state; -volatile wifi_spi_transmit_state_enum wifi_transmit_state; - -static fifo_obj_struct wifi_spi_fifo; -static uint8 wifi_spi_buffer[WIFI_SPI_BUFFER_SIZE]; // 数据存放数组 - -vuint8 wifi_spi_ack_flag = 0; // 0:模块未应答 1:模块已应答 -uint8 wifi_spi_init_flag; // 0:模块未初始化成功或者未连接 1:模块已连接并成功初始化 -vuint8 wifi_spi_packet_num; // 发送的数据包ID -vuint32 wifi_spi_send_remain_length; // 剩余的发送长度 - - - -wifi_spi_information_struct wifi_spi_information; +static fifo_struct wifi_spi_fifo; +static uint8 wifi_spi_buffer[WIFI_SPI_RECVIVE_FIFO_SIZE]; +static volatile wifi_spi_state_enum wifi_spi_mutex; //------------------------------------------------------------------------------------------------------------------- -// 函数简介 请求写入数据到模块 -// 参数说明 length 需要写入的长度 -// @return void -// Sample usage: +// 函数简介 等待WIFI SPI就绪 +// 参数说明 wait_time 最大等待时间 单位毫秒 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_write_request(uint16 length) +static uint8 wifi_spi_wait_idle (uint32 wait_time) { - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_REQUEST; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - head.magic = 0xFE; - head.sequence = wifi_spi_packet_num++; - head.length = length; + uint32 time = 0; - wifi_transmit_state = TRANSMIT_WRITE_REQUEST; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 7); - gpio_set_level(WIFI_SPI_CS_PIN, 1); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 读取模块状态 -// 参数说明 *length 需要读取或者写入的长度 -// @return WIFI_SPI_BUFFER_STATE_enum 模块状态 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static wifi_spi_buffer_state_enum wifi_spi_read_state(uint16 *length) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_CHECK_STATE; - head.addr = WIFI_SPI_STATE_ADDR; - head.dummy = 0x00; - - wifi_spi_ack_flag = 0; - wifi_transmit_state = TRANSMIT_READ_STATE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_transfer_8bit(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, &head.cmd, 7); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - - if(BUFFER_WRITE == head.magic) + wait_time = wait_time*100; + while(0 == gpio_get_level(WIFI_SPI_INT_PIN)) { - wifi_spi_packet_num = head.sequence; - } - *length = head.length; - - return (wifi_spi_buffer_state_enum)head.magic; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据发送完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_done(void) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_END; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_transmit_state = TRANSMIT_IDLE; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据接收完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_start(void) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_READ_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - wifi_transmit_state = TRANSMIT_READ; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据接收完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_done(void) -{ - wifi_spi_buffer_struct head; - - gpio_set_level(WIFI_SPI_CS_PIN, 1); - - head.cmd = WIFI_SPI_READ_END; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_transmit_state = TRANSMIT_IDLE; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块 -// 参数说明 *buff 需要写入数据的首地址 -// 参数说明 length 需要写入数据的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_data(const uint8 *buff, uint16 length) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - wifi_transmit_state = TRANSMIT_WRITE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - spi_write_8bit_array(WIFI_SPI_INDEX, buff, length); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_spi_send_done(); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_data_multi(wifi_spi_send_multi_struct *multi_buffer) -{ - uint8 i; - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - wifi_transmit_state = TRANSMIT_WRITE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - - for(i = 0; i < WIFI_SPI_MAX_MULTI; i++) - { - if(NULL != multi_buffer->source[i]) spi_write_8bit_array(WIFI_SPI_INDEX, multi_buffer->source[i], multi_buffer->length[i]); - } - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_spi_send_done(); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 接收模块发送的数据 -// 参数说明 *buff 接收数组的缓冲区首地址 -// 参数说明 length 需要接收的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_data(uint8 *buff, uint16 length) -{ - spi_read_8bit_array(WIFI_SPI_INDEX, buff, length); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送命令到模块 -// 参数说明 *str 命令字符串首地址 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_command(const char *str) -{ - uint8 state = 0; - uint16 send_length; - uint16 wait_time = 0; - - // 请求发送数据 - send_length = (uint16)strlen(str); - - // 等待传输进入空闲 - while(TRANSMIT_IDLE != wifi_transmit_state); - - // 如果没有进入发送状态则重新请求发送数据 - while(BUFFER_WRITE != wifi_buffer_state) - { - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - while(!wifi_spi_ack_flag) - { - wait_time++; - if((WAIT_TIME_OUT / 4) <= wait_time) - { - state = 1; - wifi_spi_init_flag = 0; // 模块已断开 - break; - } - system_delay_ms(1); - } - - if(1 == state) + system_delay_us(10); + time++; + if(wait_time <= time) { break; } } - - wifi_buffer_state = BUFFER_IDLE; - - if(0 == state) // 通讯未超时 - { - wifi_spi_send_remain_length = send_length; - // 发送消息 - wifi_spi_send_data((const uint8 *)str, send_length); - } + return (wait_time <= time); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 检查模块状态并读取模块发送的数据 -// 参数说明 void -// @return void -// Sample usage: +// 函数简介 写入数据到WIFI SPI +// 参数说明 *buffer1 第一组需要发送的数据缓冲区地址 +// 参数说明 length1 第一组数据长度 +// 参数说明 *buffer2 第二组需要发送的数据缓冲区地址 +// 参数说明 length2 第二组数据长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -void wifi_spi_check_state_read_buffer(void) +static void wifi_spi_write (const uint8 *buffer1, uint16 length1, const uint8 *buffer2, uint16 length2) { - uint16 wifi_spi_receive_length; // 本次接收到的数据数量 - uint8 wifi_spi_receive_buffer[WIFI_SPI_WRITE_MAX]; - - // 查询WIFI模块的状态 - wifi_buffer_state = wifi_spi_read_state(&wifi_spi_receive_length); - - // 如果需要读取WIFI模块数据,则保存需要读取的长度 - if(BUFFER_READ == wifi_buffer_state) + gpio_low(WIFI_SPI_CS_PIN); + if(NULL != buffer1) { - wifi_spi_receive_start(); - do - { - if(wifi_spi_receive_length > WIFI_SPI_WRITE_MAX) - { - wifi_spi_receive_data((uint8 *)wifi_spi_receive_buffer, WIFI_SPI_WRITE_MAX); - fifo_write_buffer(&wifi_spi_fifo, wifi_spi_receive_buffer, WIFI_SPI_WRITE_MAX); // 存入 FIFO - wifi_spi_receive_length = wifi_spi_receive_length - WIFI_SPI_WRITE_MAX; - } - else - { - wifi_spi_receive_data((uint8 *)wifi_spi_receive_buffer, wifi_spi_receive_length); - fifo_write_buffer(&wifi_spi_fifo, wifi_spi_receive_buffer, wifi_spi_receive_length); // 存入 FIFO - wifi_spi_receive_length = 0; - } - }while(wifi_spi_receive_length > 0); - wifi_spi_receive_done(); + spi_write_8bit_array(WIFI_SPI_INDEX, buffer1, length1); } - else if(BUFFER_IDLE == wifi_buffer_state) + if(NULL != buffer2) { - // 如果模块内部缓冲区状态为空闲,则传输状态也设置为空闲 - wifi_transmit_state = TRANSMIT_IDLE; + spi_write_8bit_array(WIFI_SPI_INDEX, buffer2, length2); } + gpio_high(WIFI_SPI_CS_PIN); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块 -// 参数说明 *buff 需要发送的数据首地址 -// 参数说明 length 需要发送的长度 -// @return uint32 剩余未发送长度 -// Sample usage: +// 函数简介 WIFI SPI 发送与接收同时进行(命令收发) +// 参数说明 *packets 发送与接收的地址 +// 参数说明 length 需要接收的长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_write_data(const uint8 *buff, uint32 length) +static void wifi_spi_transfer_command (wifi_spi_packets_struct *packets, uint16 length) { - uint16 send_length; - uint32 wait_time; + gpio_low(WIFI_SPI_CS_PIN); - // 记录需要发送的长度 - wifi_spi_send_remain_length = length; - - while(wifi_spi_send_remain_length) + spi_transfer_8bit(WIFI_SPI_INDEX, (uint8 *)&(packets->head), (uint8 *)&(packets->head), sizeof(wifi_spi_head_struct)); + + if(length) { - send_length = (uint16)func_limit_ab(wifi_spi_send_remain_length, 1, WIFI_SPI_WRITE_MAX); - - // 请求发送数据 - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - - // 最长等待5秒 - wait_time = 5000; - while(!wifi_spi_ack_flag) - { - wait_time--; - if(0 == wait_time) break; - system_delay_ms(1); - } - - if(BUFFER_WRITE == wifi_buffer_state) - { - // 发送消息 - wifi_spi_send_data(buff, send_length); - buff += send_length; - wifi_spi_send_remain_length -= send_length; - wifi_buffer_state = BUFFER_IDLE; - } - else - { - break; - } + spi_transfer_8bit(WIFI_SPI_INDEX, (const uint8 *)(packets->buffer), packets->buffer, length); } - - return wifi_spi_send_remain_length; + + gpio_high(WIFI_SPI_CS_PIN); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// @return uint32 剩余未发送长度 -// Sample usage: 发送数据总长度不能超过4092个 +// 函数简介 WIFI SPI 发送与接收同时进行(数据收发) +// 参数说明 *write_data 发送的数据缓冲区地址 +// 参数说明 *read_data 接收到的数据的存储地址 +// 参数说明 length 需要接收的长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_write_data_multi(wifi_spi_send_multi_struct *multi_buffer) +static void wifi_spi_transfer_data (const uint8 *write_data, wifi_spi_packets_struct *read_data, uint16 length) { - uint16 send_length; - uint32 wait_time; + gpio_low(WIFI_SPI_CS_PIN); - // 记录需要发送的长度 - send_length = multi_buffer->length[0] + multi_buffer->length[1] + multi_buffer->length[2] + multi_buffer->length[3] + multi_buffer->length[4] + multi_buffer->length[5] + multi_buffer->length[6] + multi_buffer->length[7]; + read_data->head.command = WIFI_SPI_DATA; + read_data->head.length = length; - if(WIFI_SPI_WRITE_MAX >= send_length) + spi_transfer_8bit(WIFI_SPI_INDEX, (uint8 *)&(read_data->head), (uint8 *)&(read_data->head), sizeof(wifi_spi_head_struct)); + + if(WIFI_SPI_RECVIVE_SIZE < length) { - // 请求发送数据 - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - - // 最长等待5秒 - wait_time = 5000; - while(!wifi_spi_ack_flag) - { - wait_time--; - if(0 == wait_time) break; - system_delay_ms(1); - } - - if(BUFFER_WRITE == wifi_buffer_state) - { - // 发送消息 - wifi_spi_send_data_multi(multi_buffer); - send_length = 0; - wifi_buffer_state = BUFFER_IDLE; - } + spi_transfer_8bit(WIFI_SPI_INDEX, write_data, read_data->buffer, WIFI_SPI_RECVIVE_SIZE); + spi_write_8bit_array(WIFI_SPI_INDEX, &write_data[WIFI_SPI_RECVIVE_SIZE], length - WIFI_SPI_RECVIVE_SIZE); } - - return send_length; + else + { + // 将需要发送的数据拷贝到读取缓冲区,避免出现write_data越界访问 + memcpy(read_data->buffer, write_data, length); + spi_transfer_8bit(WIFI_SPI_INDEX, read_data->buffer, read_data->buffer, WIFI_SPI_RECVIVE_SIZE); + } + gpio_high(WIFI_SPI_CS_PIN); } -//-------------------------------------------------------------------------------------------------- -// 函数简介 等待模块响应 -// 参数说明 *wait_buffer 等待的响应的字符串 -// 参数说明 timeout 超时时间 -// 返回参数 uint8 0:模块响应指定数据 1:模块未响应指定数据或超时 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_wait_ack (char *wait_buffer, uint32 timeout) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 参数设置 +// 参数说明 command 命令类型 +// 参数说明 *buffer 参数地址 +// 参数说明 length 参数长度 +// 参数说明 wait_time 最大等待时间 单位100微妙 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_set_parameter (wifi_spi_packets_command_enum command, uint8 *buffer, uint16 length, uint32 wait_time) { - uint8 return_state = 1; - char receiver_buffer[8] = {0, 0, 0, 0, 0, 0, 0, 0}; - uint32 receiver_len = 8; - + uint8 return_state; + wifi_spi_head_struct head; + return_state = 1; do { - system_delay_ms(1); - // 判断接收缓冲区内是否有需要响应的指定数据 如果有 则跳出循环并且返回0 - receiver_len = 8; - fifo_read_tail_buffer(&wifi_spi_fifo, (uint8 *)receiver_buffer, &receiver_len, FIFO_READ_ONLY); + head.command = command; + head.length = length; + + // 等待从机准备就绪 + if(wifi_spi_wait_idle(wait_time)) + { + break; + } - if(strstr(receiver_buffer, wait_buffer)) + wifi_spi_write(&head.command, sizeof(wifi_spi_head_struct), buffer, length); + if(wifi_spi_wait_idle(wait_time)) + { + break; + } + // 接收应答信号 + + head.command = WIFI_SPI_DATA; + head.length = 0; + wifi_spi_transfer_command((wifi_spi_packets_struct *)&head, head.length); + system_delay_us(20); + if(WIFI_SPI_REPLY_OK == head.command) { return_state = 0; - break; } - else if(strstr(receiver_buffer, "ERROR") || strstr(receiver_buffer, "busy")) - { - // 如果接收到报错或者模块忙 则跳出循环并且返回1 - return_state = 1; - break; - } - }while(timeout --); + }while(0); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 清除WiFi接收缓冲区内容 -// 参数说明 void -// 返回参数 void -// 使用示例 wifi_spi_clear_receive_buffer(); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static void wifi_spi_clear_receive_buffer (void) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 模块信息获取 +// 参数说明 command 命令类型 +// 参数说明 *buffer 保存接收到的参数地址 +// 参数说明 wait_time 最大等待时间 单位100微妙 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_parameter (wifi_spi_packets_command_enum command, wifi_spi_packets_struct *read_data, uint32 wait_time) { - // 清空WiFi接收缓冲区 - fifo_clear(&wifi_spi_fifo); -} + uint8 return_state; -//-------------------------------------------------------------------------------------------------- -// 函数简介 模块数据解析 -// 参数说明 *target_buffer 目标存放地址指针 字符串数组 -// 参数说明 *origin_buffer 数据来源地址指针 字符串数组 -// 参数说明 start_char 起始提取字节 例如从 "1234" 中从 '2' 开始提取 就应该填入 '2' -// 参数说明 end_char 结束提取字节 例如从 "1234" 中在 '4' 结束提取 就应该填入 '\0'(0x00 空字符 一般是字符串结尾) -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_data_parse(wifi_spi_information.mac, wifi_spi_receive_buffer, '"', '"'); // 调用获取本机mac地址后,调用此函数提取mac地址 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char start_char, char end_char) -{ - uint8 return_state = 0; - char *location1; - char *location2; - location1 = strchr((char *)origin_buffer, start_char); - if(location1) + return_state = 1; + do { - location1 ++; - location2 = strchr(location1, end_char); - if(location2) + // 等待从机准备就绪 + if(wifi_spi_wait_idle(wait_time)) { - memcpy(target_buffer, location1, location2-location1); + break; } - else + read_data->head.command = command; + wifi_spi_write(&(read_data->head.command), WIFI_SPI_RECVIVE_SIZE, NULL, 0); + + if(wifi_spi_wait_idle(wait_time)) { - return_state = 1; + break; } - } - else - { - return_state = 1; - } + read_data->head.command = WIFI_SPI_DATA; + read_data->head.length = 0; + wifi_spi_transfer_command(read_data, WIFI_SPI_RECVIVE_SIZE); + return_state = 0; + }while(0); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 查看模块版本信息 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_get_version(); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 固件版本获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,固件版本信息以字符串形式保存在wifi_spi_version数组中 +//------------------------------------------------------------------------------------------------------------------- static uint8 wifi_spi_get_version (void) { - char *location1; - uint8 return_state = 0; - uint8 receiver_buffer[256]; - uint32 receiver_len = 256; + uint8 return_state; + wifi_spi_packets_struct temp_packets; - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+GMR\r\n"); - do + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_VERSION, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_VERSION == temp_packets.head.command)) { - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - location1 = strrchr((char *)receiver_buffer, ':'); - if(wifi_spi_data_parse(wifi_spi_information.version, (uint8 *)location1, ':', '(')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - + memcpy(wifi_spi_version, temp_packets.buffer, temp_packets.head.length); + } return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 模块回显设置 -// 参数说明 model 0:关闭模块的回写功能 其他:开启模块回写 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_echo_set("1");//开启模块回写功能 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_echo_set (char *model) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI MAC地址获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,MAC地址信息以字符串形式保存在wifi_spi_mac_addr数组中 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_mac_addr (void) { - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - if('1' == *model) + uint8 return_state; + wifi_spi_packets_struct temp_packets; + + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_MAC_ADDR, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_MAC_ADDR == temp_packets.head.command)) { - wifi_spi_send_command("ATE1\r\n"); + memcpy(wifi_spi_mac_addr, temp_packets.buffer, temp_packets.head.length); + } + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI IP地址与端口号获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 +// 需要在连接Socket之后调用此函数才能正常获取信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_ip_addr_port (void) +{ + uint8 return_state; + wifi_spi_packets_struct temp_packets; + + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_IP_ADDR, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_IP_ADDR == temp_packets.head.command)) + { + memcpy(wifi_spi_ip_addr_port, temp_packets.buffer, temp_packets.head.length); + } + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 设置连接的WiFi信息并尝试连接WiFi +// 参数说明 *wifi_ssid WIFI名称 +// 参数说明 *pass_word WIFI密码 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_wifi_connect("SEEKFREE", "SEEKFREE123"); +// 备注信息 wifi_spi_wifi_connect("SEEKFREE", NULL); // 连接没有密码的WIFI热点 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_wifi_connect (char *wifi_ssid, char *pass_word) +{ + uint8 return_state; + uint8 temp_buffer[64]; + uint16 length; + + if(NULL != pass_word) + { + // WIFI热点有密码发送热点名称与密码 + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n%s\r\n", wifi_ssid, pass_word); } else { - wifi_spi_send_command("ATE0\r\n"); + // WIFI热点没有密码只需要发送热点名称 + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n", wifi_ssid); } - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + return_state = wifi_spi_set_parameter(WIFI_SPI_SET_WIFI_INFORMATION, temp_buffer, length, WIFI_CONNECT_TIME_OUT); + + // 本机IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 + wifi_spi_get_ip_addr_port(); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块自身 的 MAC 地址 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_mac()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_mac (void) -{ - uint8 return_state = 0; - uint8 receiver_buffer[64]; - uint32 receiver_len = 64; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPAPMAC?\r\n"); - do - { - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - if(wifi_spi_data_parse(wifi_spi_information.mac, receiver_buffer, '"', '"')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块或者目标WIFI 的 IP 地址(取决于模块当前的工作模式) -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_ip()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_ip (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_STATION == wifi_spi_information.mode) - { - wifi_spi_send_command("AT+CIPSTA?\r\n"); - } - else if(WIFI_SPI_SOFTAP == wifi_spi_information.mode) - { - wifi_spi_send_command("AT+CIPAP?\r\n"); - } - - do - { - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - uint8 receiver_buffer[128]; - uint32 receiver_len = 128; - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - if(wifi_spi_data_parse(wifi_spi_information.local_ip, receiver_buffer, '"', '"')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块的相关信息 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_information()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_information (void) -{ - uint8 return_state = 0; - do - { - // 获取模块版本号 - if(wifi_spi_get_version()) - { - return_state = 1; - break; - } - // 获取模块IP地址 - if(wifi_spi_get_ip()) - { - return_state = 1; - break; - } - // 获取模块MAC信息 - if(wifi_spi_get_mac()) - { - return_state = 1; - break; - } - memcpy(wifi_spi_information.local_port, "no port", 7); - }while(0); - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 连接 WiFi -// 参数说明 wifi_ssid WiFi名称 -// 参数说明 pass_word WiFi密码 -// 参数说明 model 0:查询WiFi连接情况 其他:连接WiFi -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_get_or_connect_wifi("WiFi_name", "Pass_word", 1); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_wifi (char *wifi_ssid, char *pass_word) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SOFTAP == wifi_spi_information.mode) - { - sprintf(temp, "AT+CWSAP=\"%s\",\"%s\",5,3\r\n", wifi_ssid, pass_word); - wifi_spi_send_command(temp); - } - else - { - sprintf(temp, "AT+CWJAP=\"%s\",\"%s\"\r\n", wifi_ssid, pass_word); - wifi_spi_send_command(temp); - } - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 上电是否自动连接WiFi -// 参数说明 model 0:上电不自动连接wifi 其他:上电自动连接wifi -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_auto_connect_wifi(0); //上电不自动连接wifi -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_auto_connect_wifi (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CWAUTOCONN=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置连接模式 -// 参数说明 model 0: 单连接模式 1:多连接模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_connect_model("1"); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_connect_model (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPMUX=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置传输模式 -// 参数说明 model – 0: 普通传输模式 IP断开后不重新连接 -// – 1: Wi-Fi 透传接收模式,仅支持 TCP 单连接、UDP 固定通信对端、SSL 单连接的情况 IP断开后会不断尝试重新连接 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_transfer_model("1"); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_transfer_model (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPMODE=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置模块模式 (Station/SoftAP/Station+SoftAP) -// 参数说明 state 0:无 Wi-Fi 模式,并且关闭 Wi-Fi RF----1: Station 模式----2: SoftAP 模式----3: SoftAP+Station 模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_model("1"); +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 设置连接的Socket信息并尝试连接Socket +// 参数说明 *transport_type 传输类型 +// 参数说明 *ip_addr IP地址 +// 参数说明 *port 目标端口号 +// 参数说明 *local_port 本机端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_socket_connect("TCP", "192.168.2.5", "8080", "6060"); // 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_set_model (wifi_spi_mode_enum mode) +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_socket_connect (char *transport_type, char *ip_addr, char *port, char *local_port) { - uint8 return_state = 0; + uint8 return_state; + uint8 temp_buffer[41]; + uint16 length; + + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n%s\r\n%s\r\n%s\r\n", transport_type, ip_addr, port, local_port); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + return_state = wifi_spi_set_parameter(WIFI_SPI_SET_SOCKET_INFORMATION, temp_buffer, length, SOCKET_CONNECT_TIME_OUT); - if(WIFI_SPI_SOFTAP == mode) - { - wifi_spi_send_command("AT+CWMODE=2\r\n"); - } - else - { - wifi_spi_send_command("AT+CWMODE=1\r\n"); - } - // 设置模块工作模式 - wifi_spi_information.mode = mode; - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + // 本机IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 + wifi_spi_get_ip_addr_port(); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 关闭睡眠模式 -// 参数说明 mode -// 返回参数 uint8 0:成功 1:失败 +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 断开Socket连接 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_socket_disconnect(); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_socket_disconnect (void) +{ + wifi_spi_packets_struct temp_packets; + + return wifi_spi_get_parameter(WIFI_SPI_CLOSE_SOCKET, &temp_packets, OTHER_TIME_OUT); +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 软复位 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 // 使用示例 // 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_close_sleep_model (void) +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_reset (void) { - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+SLEEP=0\r\n"); - // 设置模块工作模式 - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 断开与wifi的连接 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_disconnected_wifi(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_disconnected_wifi (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CWQAP\r\n"); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 进入打开透传模式 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_entry_serianet(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_entry_serianet (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPSEND\r\n"); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 退出透传模式 -// 参数说明 model 0:关闭透传模式 其他:开启透传模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_exit_serianet(1); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_exit_serianet (void) -{ - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - system_delay_ms(20); - wifi_spi_send_command("+++"); - system_delay_ms(1000); - - return 0; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 建立TCP连接 -// 参数说明 ip 远端 IPv4 地址、IPv6 地址,或域名 -// 参数说明 port 远端端口值 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_connect_tcp_servers("192.168.101.110", "8080"); -// 备注信息 如果总是连接不上电脑的TCP服务器 可以尝试使用网线连接电脑 -// 如果是使用WiFi连接 可能会导致模块连接TCP服务器等待较长时间 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_connect_tcp_servers (char *ip, char *port, wifi_spi_transfer_mode_enum mode) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + uint8 return_state; + wifi_spi_head_struct head; + return_state = 1; do { - if(wifi_spi_set_connect_model("0")) + head.command = WIFI_SPI_RESET; + head.length = 0xA5A5; + return_state = wifi_spi_wait_idle(OTHER_TIME_OUT); + if(return_state) { - return_state = 1; break; } + wifi_spi_write(&head.command, sizeof(wifi_spi_head_struct), NULL, 0); + }while(0); + + return return_state; +} - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPSTARTEX=\"TCP\",\"%s\",%s\r\n", ip, port); - wifi_spi_send_command(temp); - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI UDP模式时立即发送函数 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 在UDP模式下模块收到数据后会等待2毫秒,2毫秒后未收到数据则将数据通过socket发送到网络,如果希望立即发送则在数据传输完毕后调用此函数 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_udp_send_now (void) +{ + uint8 return_state = 1; + wifi_spi_packets_struct temp_packets; + + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + do { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - // 设置传输模式 - if(wifi_spi_set_transfer_model(WIFI_SPI_COMMAND == mode ? "0" : "1")) - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPSTATE?\r\n"); - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - else - { - uint8 receiver_buffer[128]; - uint32 receiver_len = 128; - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - char* buffer_index = (char *)receiver_buffer; - char* end_index; - - buffer_index += 22; - buffer_index += strlen(ip); - buffer_index += strlen(port); - end_index = strchr(buffer_index, ','); - - memcpy(wifi_spi_information.local_port, " ", 7); - memcpy(wifi_spi_information.local_port, buffer_index, (end_index - buffer_index)); - } - - wifi_spi_information.connect_state = WIFI_SPI_SERVER_ON; - wifi_spi_information.connect_mode = WIFI_SPI_TCP_CLIENT; - wifi_spi_information.transfer_mode = mode; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SERIANET == mode) // 透传模式下直接开启透传 - { - if(wifi_spi_entry_serianet()) + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) { - return_state = 1; break; } - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 建立UDP连接 -// 参数说明 *ip 远端 IPv4 地址、IPv6 地址 或域名 字符串形式 -// 参数说明 *port 远端端口值 字符串形式 -// 参数说明 *local_port 远端 IPv4 地址、IPv6 地址 或域名 字符串形式 -// 参数说明 mode 模块数据通信模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_connect_udp_client("192.168.101.110", "8080", "8080", WIFI_SPI_COMMAND); -// 备注信息 自动分配ID -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_connect_udp_client (char *ip, char *port, char *local_port, wifi_spi_transfer_mode_enum mode) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - do - { - if(wifi_spi_set_connect_model("0")) - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + // 立即开始socket发送 + temp_packets.head.command = WIFI_SPI_UDP_SEND; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + + // 等待应答信号 + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + + // 接收应答信号 + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, temp_packets.head.length); + + if(WIFI_SPI_REPLY_OK == temp_packets.head.command) + { + return_state = 0; + } + + }while(0); - sprintf(temp, "AT+CIPSTARTEX=\"UDP\",\"%s\",%s,%s\r\n", ip, port, local_port); - wifi_spi_send_command(temp); + // 将通讯状态设置为空闲 + wifi_spi_mutex = WIFI_SPI_IDLE; + } + + return return_state; +} - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 数据块发送函数并同步接收数据 +// 参数说明 *buff 需要发送的数据地址 +// 参数说明 length 发送长度 +// 返回参数 uint32 剩余未发送的长度 +// 使用示例 wifi_spi_send_buffer(buffer, 100); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +uint32 wifi_spi_send_buffer (const uint8 *buffer, uint32 length) +{ + uint16 send_length; + wifi_spi_packets_struct temp_packets; + + // 检查WIFI SPI状态,如果在其他中断或者线程中已经发起了通讯,则本次不能发送数据 + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + + while(length) { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_spi_set_transfer_model(WIFI_SPI_COMMAND == mode ? "0" : "1")) // 设置传输模式 - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SERIANET == mode) // 透传模式下直接开启透传 - { - if(wifi_spi_entry_serianet()) + send_length = length > WIFI_SPI_TRANSFER_SIZE ? (uint16)WIFI_SPI_TRANSFER_SIZE : (uint16)length; + + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) { - return_state = 1; break; } - } - memcpy(wifi_spi_information.local_port, " ", 7); - memcpy(wifi_spi_information.local_port, local_port, strlen(local_port)); - wifi_spi_information.connect_state = WIFI_SPI_SERVER_ON; - wifi_spi_information.connect_mode = WIFI_SPI_UDP_CLIENT; - wifi_spi_information.transfer_mode = mode; - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 断开连接 TCP Server 使用本接口将会断开所有连接 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_disconnect_link(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_disconnect_link (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - do - { - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - wifi_spi_send_command("AT+CIPCLOSE=5\r\n"); - } - else - { - wifi_spi_send_command("AT+CIPCLOSE\r\n"); - } - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送字节函数 -// 参数说明 data 需要发送的数据 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_byte(0xa5); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_byte (uint8 data) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - send_length = 1; - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data(&data, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else - { - send_length = (uint16)wifi_spi_write_data(&data, send_length); - } - } - } - - return send_length; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送缓冲区函数 -// 参数说明 buff 需要发送的数据地址 -// 参数说明 len 发送长度 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_buffer("123", 3); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 len) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - while(len) - { - if((WIFI_SPI_WRITE_MAX * 2) < len) send_length = WIFI_SPI_WRITE_MAX * 2; - else - { - send_length = (uint16)len; - } - len -= send_length; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data(buff, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } - buff += send_length; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else - { - len = wifi_spi_write_data(buff, len); - } - } - } - - return len; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送缓冲区函数(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 -// 备注信息 需要发送多个数组时,采用此函数可以极大的降低通讯时间,发送数据总长度不能超过4092 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_buffer_multi (wifi_spi_send_multi_struct *multi_buffer) -{ - uint8 i; - uint16 remain_length; - - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - for(i = 0; i < WIFI_SPI_MAX_MULTI; i++) - { - if(multi_buffer->source[i]) wifi_spi_send_buffer(multi_buffer->source[i], multi_buffer->length[i]); - } - } - else - { - remain_length = (uint16)wifi_spi_write_data_multi(multi_buffer); - } - } - } - - return remain_length; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送字符串函数 -// 参数说明 *str 需要发送的数据 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_string("123"); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_string (const char *str) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - send_length = (uint16)strlen(str); - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data((uint8 *)str, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } + wifi_spi_transfer_data(buffer, &temp_packets, send_length); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) { - send_length = (uint16)wifi_spi_write_data((uint8 *)str, send_length); + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + + length -= send_length; + buffer += send_length; + } + + // 检查最后一次的接收是否将所有的数据都接收完毕 + while(WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) + { + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + + // 继续读取模块剩余数据 + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } } } + wifi_spi_mutex = WIFI_SPI_IDLE; } - - return send_length; + return length; } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi 模块数据接收函数 -// 参数说明 buffer 接收数据的存放地址 -// 参数说明 len 数组长度,可直接填写或者使用sizeof求得 -// 返回参数 uint32 返回实际接收到的数据长度 -// 使用示例 uint8 test_buffer[256]; wifi_spi_read_buffer(&test_buffer[0], sizeof(test_buffer)); +// 函数简介 WIFI SPI 读取缓冲区 +// 参数说明 *buff 接收缓冲区 +// 参数说明 length 读取数据长度 +// 返回参数 uint32 实际读取数据长度 +// 使用示例 wifi_spi_read_buffer(buffer, 100); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 len) +uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 length) { - fifo_read_buffer(&wifi_spi_fifo, buffer, &len, FIFO_READ_AND_CLEAN); - return len; + zf_assert(NULL != buffer); + uint32 data_len = length; + +#if(1 == WIFI_SPI_READ_TRANSFER) + + wifi_spi_packets_struct temp_packets; + // 检查WIFI SPI状态,如果在其他中断或者线程中已经发起了通讯,则本次不能发送数据 + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + + // 发起通讯查看模块内是否有数据未读取 + do + { + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + }while(WIFI_SPI_REPLY_DATA_START == temp_packets.head.command); + wifi_spi_mutex = WIFI_SPI_IDLE; + } +#endif + + fifo_read_buffer(&wifi_spi_fifo, buffer, &data_len, FIFO_READ_AND_CLEAN); + return data_len; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 wifi spi handshake中断回调函数 -// 参数说明 void -// 返回参数 void -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -void wifi_spi_callback (void) -{ - wifi_spi_check_state_read_buffer(); - wifi_spi_ack_flag = 1; // ACK标志位置1 -} - - //------------------------------------------------------------------------------------------------------------------- // 函数简介 WiFi 模块初始化 // 参数说明 *wifi_ssid 目标连接的 WiFi 的名称 字符串形式 // 参数说明 *pass_word 目标连接的 WiFi 的密码 字符串形式 -// 参数说明 wifi_mode 模块的工作模式 参照 zf_device_wireless_spi.h 中 wifi_spi_mode_enum 枚举 // 返回参数 uint8 模块初始化状态 0-成功 1-错误 -// 使用示例 wifi_spi_init("SEEKFREE_2.4G", "SEEKFREEV2", WIFI_UART_STATION); -// 备注信息 初始化会首先设置串口配置,之后会对模块进行基本参数配置 -// 具体的配置信息可以在 zf_device_wireless_spi.h 文件中修改 +// 使用示例 wifi_spi_init("SEEKFREE", "SEEKFREE123"); +// 备注信息 wifi_spi_init("SEEKFREE", NULL); // 连接没有密码的WIFI热点 //------------------------------------------------------------------------------------------------------------------- -uint8 wifi_spi_init (char *wifi_ssid, char *pass_word, wifi_spi_mode_enum wifi_mode) +uint8 wifi_spi_init (char *wifi_ssid, char *pass_word) { uint8 return_state = 0; - uint32 temp_isr; - - spi_init(WIFI_SPI_INDEX, SPI_MODE0, WIFI_SPI_SPEED, WIFI_SPI_SCK_PIN, WIFI_SPI_MOSI_PIN, WIFI_SPI_MISO_PIN, SPI_CS_NULL);//硬件SPI初始化 - set_wireless_type(WIFI_SPI, wifi_spi_callback); - fifo_init(&wifi_spi_fifo, FIFO_DATA_8BIT, wifi_spi_buffer, WIFI_SPI_BUFFER_SIZE); + fifo_init(&wifi_spi_fifo, FIFO_DATA_8BIT, wifi_spi_buffer, WIFI_SPI_RECVIVE_FIFO_SIZE); + spi_init(WIFI_SPI_INDEX, SPI_MODE3, WIFI_SPI_SPEED, WIFI_SPI_SCK_PIN, WIFI_SPI_MOSI_PIN, WIFI_SPI_MISO_PIN, SPI_CS_NULL);//硬件SPI初始化 gpio_init(WIFI_SPI_CS_PIN, GPO, 1, GPO_PUSH_PULL); gpio_init(WIFI_SPI_RST_PIN, GPO, 1, GPO_PUSH_PULL); - - temp_isr = interrupt_global_disable(); - - exti_init(WIFI_SPI_INT_PIN, EXTI_TRIGGER_RISING); - + gpio_init(WIFI_SPI_INT_PIN, GPI, 0, GPI_PULL_DOWN); + + // 复位 gpio_set_level(WIFI_SPI_RST_PIN, 0); - system_delay_ms(50); + system_delay_ms(10); gpio_set_level(WIFI_SPI_RST_PIN, 1); - system_delay_ms(1000); + + // 等待模块初始化 + system_delay_ms(100); + wifi_spi_mutex = WIFI_SPI_IDLE; - exti_flag_clear(WIFI_SPI_INT_PIN); - - interrupt_global_enable(temp_isr); do { - if(wifi_spi_echo_set("0")) // 关闭模块回写 + // 固件版本信息以字符串形式保存在wifi_spi_version数组中 + return_state = wifi_spi_get_version(); + if(return_state) + { + break; + } + + // MAC地址信息以字符串形式保存在wifi_spi_mac_addr数组中 + wifi_spi_get_mac_addr(); + + + return_state = wifi_spi_wifi_connect(wifi_ssid, pass_word); + if(return_state) { - zf_log(0, "exit echo failed"); - return_state = 1; break; } - if(wifi_spi_auto_connect_wifi("0")) // 关闭自动连接 + #if(1 == WIFI_SPI_AUTO_CONNECT) + return_state = wifi_spi_socket_connect("TCP", WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT); + if(return_state) { - zf_log(0, "close auto connect failed"); - return_state = 1; break; } - - if(wifi_spi_set_model(wifi_mode)) // 设置运行模式 + #endif + + #if(2 == WIFI_SPI_AUTO_CONNECT) + return_state = wifi_spi_socket_connect("UDP", WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT); + if(return_state) { - zf_log(0, "set run mode failed"); - return_state = 1; break; } - - if(wifi_spi_close_sleep_model()) // 关闭睡眠模式 - { - zf_log(0, "set sleep mode failed"); - return_state = 1; - break; - } - - if(wifi_spi_set_wifi((char *)wifi_ssid, (char *)pass_word)) // 连接 wifi 或者开启热点 - { - zf_log(0, "wifi set failed"); - return_state = 1; - break; - } - - if(wifi_spi_get_information()) // 模块基本参数获取 - { - zf_log(0, "get module information failed"); - return_state = 1; - break; - } -#if WIFI_SPI_AUTO_CONNECT == 1 - if(wifi_spi_connect_tcp_servers(WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_SERIANET)) // 连接TCP服务器 - { - zf_log(0, "connect TCP server failed"); - return_state = 1; - break; - } -#endif -#if WIFI_SPI_AUTO_CONNECT == 2 - if(wifi_spi_connect_udp_client(WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT, WIFI_SPI_SERIANET)) // 建立UDP连接 - { - zf_log(0, "connect UDP server failed"); - return_state = 1; - break; - } -#endif - // 模块初始化成功 - wifi_spi_init_flag = 1; + #endif }while(0); - + return return_state; } diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_wifi_spi.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_wifi_spi.h index 5e5a025..24e7eb1 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_wifi_spi.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_wifi_spi.h @@ -24,13 +24,13 @@ * 文件名称 zf_device_wifi_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 * 日期 作者 备注 -* 2023-05-27 pudding first version +* 2024-01-18 SeekFree first version ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,128 +53,100 @@ #include "zf_common_typedef.h" + #define WIFI_SPI_INDEX (SPI_3 ) // 定义使用的SPI号 -#define WIFI_SPI_SPEED (30 * 1000 * 1000 ) // 硬件 SPI 速率 +#define WIFI_SPI_SPEED (50 * 1000 * 1000 ) // 硬件 SPI 速率 #define WIFI_SPI_SCK_PIN (SPI3_SCLK_P22_3 ) // 定义SPI_SCK引脚 #define WIFI_SPI_MOSI_PIN (SPI3_MOSI_P22_0 ) // 定义SPI_MOSI引脚 #define WIFI_SPI_MISO_PIN (SPI3_MISO_P22_1 ) // 定义SPI_MISO引脚 IPS没有MISO引脚,但是这里任然需要定义,在spi的初始化时需要使用 #define WIFI_SPI_CS_PIN (P22_2 ) // 定义SPI_CS引脚 采用软件CS引脚 -#define WIFI_SPI_INT_PIN (ERU_CH5_REQ1_P15_8) // 定义中断引脚 +#define WIFI_SPI_INT_PIN (P15_8 ) // 定义握手引脚 #define WIFI_SPI_RST_PIN (P23_1 ) // 定义复位引脚 - - -#define WIFI_SPI_BUFFER_SIZE (1024) // 定义SPI接收的缓冲区大小 -#define WIFI_SPI_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不连接 1-自动连接TCP服务器并进入透传模式 2-自动连接UDP服务器并进入透传模式 3:自动建立TCP服务器 - -#if (WIFI_SPI_AUTO_CONNECT > 2) + +#define WIFI_SPI_RECVIVE_FIFO_SIZE (1024) // 接收FIFO大小 +#define WIFI_SPI_READ_TRANSFER (1) // 在调用wifi_spi_read_buffer 是否尝试发起SPI通讯来检测模块内是否有数据需要读取 1:发起SPI通讯 0:不发起SPI通讯,仅读取FIFO + // 如果应用程序中没有任何的地方调用发送函数,则WIFI_SPI_READ_TRANSFER必须设置为1 + +#define WIFI_SPI_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不自动连接 1-自动连接TCP服务器 2-自动连接UDP + +#if (WIFI_SPI_AUTO_CONNECT > 2) #error "WIFI_SPI_AUTO_CONNECT 的值只能为 [0,1,2]" #else -#define WIFI_SPI_TARGET_IP "192.168.2.28" // 连接目标的 IP +#define WIFI_SPI_TARGET_IP "192.168.137.1" // 连接目标的 IP #define WIFI_SPI_TARGET_PORT "8080" // 连接目标的端口 -#define WIFI_SPI_LOCAL_PORT "8080" // 本机端口 +#define WIFI_SPI_LOCAL_PORT "6666" // 本机的端口 0:随机 可设置范围2048-65535 默认 6666 #endif -#define WIFI_SPI_MAX_MULTI (17) // 多地址发送,最大8个地址 -typedef enum -{ - BUFFER_IDLE, // 模块的缓冲区是空闲的 - BUFFER_READ, // 模块的缓冲区有数据需要读取 - BUFFER_WRITE, // 模块的缓冲区是可写的 -}wifi_spi_buffer_state_enum; +#define WIFI_SPI_RECVIVE_SIZE (32) // 每次SPI传输接收的字节数 不允许修改 +#define WIFI_SPI_TRANSFER_SIZE (4088) // 最大SPI传输接收的字节数 不允许修改 + + typedef enum -{ - TRANSMIT_IDLE, // 当前没有传输 - TRANSMIT_WRITE_REQUEST, // 给模块发送了一个传输请求 - TRANSMIT_READ_STATE, // 读取模块状态 - TRANSMIT_READ, // 正在读取模块内部数据 - TRANSMIT_WRITE, // 正在往模块写入数据 -}wifi_spi_transmit_state_enum; - -typedef enum -{ - WIFI_SPI_STATION, // 设备模式 - WIFI_SPI_SOFTAP, // AP模式 -}wifi_spi_mode_enum; - -typedef enum -{ - WIFI_SPI_COMMAND, // 使用命令的方式发送数据 - WIFI_SPI_SERIANET, // 使用透传的方式发送数据 -}wifi_spi_transfer_mode_enum; - -typedef enum -{ - WIFI_SPI_TCP_CLIENT, // 模块连接TCP服务器 - WIFI_SPI_TCP_SERVER, // 模块作为TCP服务器 - WIFI_SPI_UDP_CLIENT, // 模块启用UDP连接 -}wifi_spi_connect_mode_enum; - -typedef enum -{ - WIFI_SPI_SERVER_OFF, // 模块未连接服务器 - WIFI_SPI_SERVER_ON, // 模块已经连接服务器 -}wifi_spi_connect_state_enum; - -typedef enum -{ - WIFI_SPI_LINK_0, // 模块当前链接 0 - WIFI_SPI_LINK_1, // 模块当前链接 1 - WIFI_SPI_LINK_2, // 模块当前链接 2 - WIFI_SPI_LINK_3, // 模块当前链接 3 - WIFI_SPI_LINK_4, // 模块当前链接 4 -}wifi_spi_link_id_enum; - -typedef struct { - uint8 reserve; - uint8 cmd; - uint8 addr; - uint8 dummy; - uint8 magic; - uint8 sequence; - uint16 length; -}wifi_spi_buffer_struct; + // 主机发送的命令 + WIFI_SPI_INVALID1 = 0x00, // 无效数据包 + WIFI_SPI_RESET = 0x01, // 复位命令 + WIFI_SPI_DATA = 0x02, // 透传数据包 + WIFI_SPI_UDP_SEND = 0x03, // UDP下立即发送命令,默认SPI接收数据后2MS未收到数据自动发送数据 + WIFI_SPI_CLOSE_SOCKET = 0x04, // 断开连接 + + WIFI_SPI_SET_WIFI_INFORMATION = 0x10, // 设置WIFI信息命令 + WIFI_SPI_SET_SOCKET_INFORMATION = 0x11, // 设置SOCKET信息命令 + + WIFI_SPI_GET_VERSION = 0x20, // 获取模块版本 + WIFI_SPI_GET_MAC_ADDR = 0x21, // 获取模块MAC地址 + WIFI_SPI_GET_IP_ADDR = 0x22, // 获取模块IP地址 + + // 从机回传的命令 + WIFI_SPI_REPLY_OK = 0x80, // 从机应答的正确命令 + WIFI_SPI_REPLY_ERROR = 0x81, // 从机应答的错误命令 + + WIFI_SPI_REPLY_DATA_START = 0x90, // 从机回传的数据包,并且还有数据需要主机读取 + WIFI_SPI_REPLY_DATA_END = 0x91, // 从机回传的数据包,数据已读取完毕 + + WIFI_SPI_REPLY_VERSION = 0xA0, // 从机回复固件版本 + WIFI_SPI_REPLY_MAC_ADDR = 0xA1, // 从机回复本机MAC地址等信息 + WIFI_SPI_REPLY_IP_ADDR = 0xA2, // 从机回复本机IP地址、端口号 + WIFI_SPI_INVALID2 = 0xFF // 无效数据包 +}wifi_spi_packets_command_enum; + +typedef enum +{ + WIFI_SPI_IDLE, // 模块空闲,可以进行SPI通讯 + WIFI_SPI_BUSY, // 模块正忙,不可进行SPI通讯 +}wifi_spi_state_enum; + + +typedef struct +{ + uint8 command; // 命令字 + uint8 reserve; // 保留 + uint16 length; // 包有效长度 +}wifi_spi_head_struct; + + +typedef struct +{ + wifi_spi_head_struct head; // 帧头 + uint8 buffer[WIFI_SPI_RECVIVE_SIZE]; // 缓冲区 +}wifi_spi_packets_struct; + + +extern char wifi_spi_version[12]; // 固件版本 字符串 +extern char wifi_spi_mac_addr[20]; // 模块MAC地址 字符串 +extern char wifi_spi_ip_addr_port[25]; // IP地址与端口号 字符串 -typedef struct -{ - uint8 version[12]; // 固件版本 字符串形式 - uint8 mac[20]; // 本机 MAC 地址 字符串形式 - uint8 local_ip[17]; // 本机 IP 地址 字符串形式 - uint8 local_port[10]; // 本机端口号 字符串形式 - uint8 remote_ip[5][17]; // 远端 IP 地址 字符串形式 - wifi_spi_mode_enum mode; // WIFI 模式 - wifi_spi_transfer_mode_enum transfer_mode; // 当前传输模式 - wifi_spi_connect_mode_enum connect_mode; // 网络连接模式 - wifi_spi_connect_state_enum connect_state; // 服务器连接情况 -}wifi_spi_information_struct; +uint8 wifi_spi_wifi_connect (char *wifi_ssid, char *pass_word); +uint8 wifi_spi_socket_connect (char *transport_type, char *ip_addr, char *port, char *local_port); +uint8 wifi_spi_socket_disconnect (void); +uint8 wifi_spi_udp_send_now (void); +uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 length); +uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 length); -typedef struct -{ - uint8 *source[WIFI_SPI_MAX_MULTI]; - uint16 length[WIFI_SPI_MAX_MULTI]; -}wifi_spi_send_multi_struct; - -extern wifi_spi_information_struct wifi_spi_information; - - -uint8 wifi_spi_disconnected_wifi (void); // 断开 WIFI 连接 -uint8 wifi_spi_entry_serianet (void); // 打开透传模式 -uint8 wifi_spi_exit_serianet (void); // 关闭透传模式 - -uint8 wifi_spi_connect_tcp_servers (char *ip, char *port, wifi_spi_transfer_mode_enum mode); // 建立 TCP 连接 -uint8 wifi_spi_connect_udp_client (char *ip, char *port, char *local_port, wifi_spi_transfer_mode_enum mode); // 建立 UDP 传输 -uint8 wifi_spi_disconnect_link (void); // 断开连接 TCP Server 使用本接口将会断开所有连接 - -uint32 wifi_spi_send_byte (uint8 data); // WIFI 模块发送字节函数 -uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 length); // WIFI 模块发送缓冲区函数 -uint32 wifi_spi_send_buffer_multi (wifi_spi_send_multi_struct *multi_buffer); // WIFI 模块发送多缓冲区函数 -uint32 wifi_spi_send_string (const char *str); // WIFI 模块发送字符串函数 - -uint32 wifi_spi_read_buffer (uint8 *buff, uint32 len); // WIFI 模块数据接收函数 - -uint8 wifi_spi_init (char *wifi_ssid, char *pass_word, wifi_spi_mode_enum wifi_mode); // WIFI 模块初始化函数 +uint8 wifi_spi_init (char *wifi_ssid, char *pass_word); #endif + diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_wifi_uart.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_wifi_uart.c index 312dab7..ff728bb 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_wifi_uart.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_wifi_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_wifi_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -61,7 +61,7 @@ wifi_uart_information_struct wifi_uart_information; // 模块自身参数 -static fifo_obj_struct wifi_uart_fifo; +static fifo_struct wifi_uart_fifo; static uint8 wifi_uart_buffer[WIFI_UART_BUFFER_SIZE]; // 数据存放数组 static uint8 wifi_uart_data; diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_wifi_uart.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_wifi_uart.h index abcb253..3316b6f 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_wifi_uart.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_wifi_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_wifi_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_wireless_uart.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_wireless_uart.c index eac2867..91ec013 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_wireless_uart.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_wireless_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_wireless_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -53,7 +53,7 @@ #include "zf_device_type.h" #include "zf_device_wireless_uart.h" -static fifo_obj_struct wireless_uart_fifo; +static fifo_struct wireless_uart_fifo; static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; static uint8 wireless_uart_data = 0; diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_wireless_uart.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_wireless_uart.h index 2418545..a789ad0 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_wireless_uart.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_wireless_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_wireless_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -61,11 +61,11 @@ // 注意事项2:开启自动波特率务必连接RTS引脚 否则会开启失败。 // 注意事项3:模块自动波特率失败的话 可以尝试断电重启 -// 开启自动波特率务必阅读上面两条 注意事项 -// 开启自动波特率务必阅读上面两条 注意事项 -// 开启自动波特率务必阅读上面两条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 -// 0:关闭自动波特率 +// 0:关闭自动波特率 // 1:开启自动波特率 自动波特率的作用是修改 WIRELESS_UART_BAUD 之后不需要对模块进行配置 模块会自动设置为对应的波特率 #define WIRELESS_UART_AUTO_BAUD_RATE ( 1 ) diff --git a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_adc.c b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_adc.c index 9a262a1..06694d8 100644 --- a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_adc.c +++ b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_adc.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_adc * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_adc.h b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_adc.h index 378b67e..f017c76 100644 --- a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_adc.h +++ b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_adc.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_adc * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_delay.c b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_delay.c index 4ec533c..ae3e610 100644 --- a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_delay.c +++ b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_delay.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_delay * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_delay.h b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_delay.h index e8d82ef..7b8b475 100644 --- a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_delay.h +++ b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_delay.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_delay * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_dma.c b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_dma.c index f72f1d6..43bffbc 100644 --- a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_dma.c +++ b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_dma.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_dma * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_dma.h b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_dma.h index 1ec555b..320d40c 100644 --- a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_dma.h +++ b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_dma.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_dma * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_encoder.c b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_encoder.c index 6592198..0e0e0b9 100644 --- a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_encoder.c +++ b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_encoder.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_encoder.h b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_encoder.h index 68d159f..e079122 100644 --- a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_encoder.h +++ b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_encoder.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_exti.c b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_exti.c index 72c9a1f..31d270a 100644 --- a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_exti.c +++ b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_exti.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_exti * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_exti.h b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_exti.h index 30f5ef6..b63f9ee 100644 --- a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_exti.h +++ b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_exti.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_exti * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_flash.c b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_flash.c index f91f5a0..325cfed 100644 --- a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_flash.c +++ b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_flash.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_flash * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_flash.h b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_flash.h index 912585a..e7425fd 100644 --- a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_flash.h +++ b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_flash.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_flash * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_gpio.c b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_gpio.c index 5071114..a084353 100644 --- a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_gpio.c +++ b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_gpio.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_gpio * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_gpio.h b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_gpio.h index 2b23be0..550fb8d 100644 --- a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_gpio.h +++ b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_gpio.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_gpio * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_pit.c b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_pit.c index c4dc50d..5e03d38 100644 --- a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_pit.c +++ b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_pit.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pit * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_pit.h b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_pit.h index 5461e05..66854b5 100644 --- a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_pit.h +++ b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_pit.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pit * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_pwm.c b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_pwm.c index ad1059a..24d8d7a 100644 --- a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_pwm.c +++ b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_pwm.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pwm * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_pwm.h b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_pwm.h index d6dce78..51948a4 100644 --- a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_pwm.h +++ b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_pwm.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pwm * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_soft_iic.c b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_soft_iic.c index 9833b62..a349ec7 100644 --- a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_soft_iic.c +++ b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_soft_iic.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_iic * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_soft_iic.h b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_soft_iic.h index a62b262..80db53b 100644 --- a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_soft_iic.h +++ b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_soft_iic.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_iic * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_soft_spi.c b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_soft_spi.c index 292c60b..954fbe3 100644 --- a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_soft_spi.c +++ b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_soft_spi.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_soft_spi.h b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_soft_spi.h index 6a9c207..62858de 100644 --- a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_soft_spi.h +++ b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_soft_spi.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_spi.c b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_spi.c index 1b99196..f817dd9 100644 --- a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_spi.c +++ b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_spi.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -920,7 +920,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 do { - IfxQspi_writeTransmitFifo(moudle, (uint8)(*write_buffer & 0xFF00) >> 8); // 将发送的数据写入缓冲区 + IfxQspi_writeTransmitFifo(moudle, (uint8)((*write_buffer & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 if(read_buffer != NULL) { diff --git a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_spi.h b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_spi.h index e73507e..d15589c 100644 --- a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_spi.h +++ b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_spi.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_timer.c b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_timer.c index a953b92..e085d6e 100644 --- a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_timer.c +++ b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_timer.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_timer * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_timer.h b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_timer.h index 3c86f58..1bb348f 100644 --- a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_timer.h +++ b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_timer.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_timer * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_uart.c b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_uart.c index cd19782..fb89b55 100644 --- a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_uart.c +++ b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_uart.h b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_uart.h index 8d1d111..cdc55ab 100644 --- a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_uart.h +++ b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E03_adc_demo/user/isr.c b/Example/E03_adc_demo/user/isr.c index 27171d2..9108ff0 100644 --- a/Example/E03_adc_demo/user/isr.c +++ b/Example/E03_adc_demo/user/isr.c @@ -24,7 +24,7 @@ * 文件名称 isr * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -118,7 +118,7 @@ IFX_INTERRUPT(exti_ch1_ch5_isr, 0, EXTI_CH1_CH5_INT_PRIO) { exti_flag_clear(ERU_CH5_REQ1_P15_8); - wireless_module_spi_handler(); // SPI WIFI 中断回调函数 + } } diff --git a/Example/E04_pwm_demo/libraries/doc/version.txt b/Example/E04_pwm_demo/libraries/doc/version.txt index b841b50..d644136 100644 --- a/Example/E04_pwm_demo/libraries/doc/version.txt +++ b/Example/E04_pwm_demo/libraries/doc/version.txt @@ -1,3 +1,8 @@ +V3.2.6 + 更新逐飞助手接口函数 调用初始化时直接传参通信类 + 更新wifi SPI驱动文件 提高通信效率 + 更新GPS驱动文件,更名为GNSS,兼容普通定位模块及RTK + V3.2.5 修复延时函数初始化参数及中断向量表问题 V3.2.4 diff --git a/Example/E04_pwm_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h b/Example/E04_pwm_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h index 28ff689..371e6b6 100644 --- a/Example/E04_pwm_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h +++ b/Example/E04_pwm_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h @@ -34,7 +34,7 @@ /*------------------------------------------Configuration for IfxScu_cfg.h-------------------------------------------*/ /*********************************************************************************************************************/ /* External oscillator frequency in Hz */ -#define IFX_CFG_SCU_XTAL_FREQUENCY (20000000) /* Allowed values are: 16000000, 20000000 or 40000000 */ +#define IFX_CFG_SCU_XTAL_FREQUENCY (20000000) /* Allowed values are9p: 16000000, 20000000 or 40000000 */ /* PLL frequency in Hz */ #define IFX_CFG_SCU_PLL_FREQUENCY (200000000) /* Allowed values are: 80000000, 133000000, 160000000 * or 200000000 */ diff --git a/Example/E04_pwm_demo/libraries/zf_common/zf_common_clock.c b/Example/E04_pwm_demo/libraries/zf_common/zf_common_clock.c index 5023270..9872ea9 100644 --- a/Example/E04_pwm_demo/libraries/zf_common/zf_common_clock.c +++ b/Example/E04_pwm_demo/libraries/zf_common/zf_common_clock.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_clock * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_common/zf_common_clock.h b/Example/E04_pwm_demo/libraries/zf_common/zf_common_clock.h index 9face65..2b50396 100644 --- a/Example/E04_pwm_demo/libraries/zf_common/zf_common_clock.h +++ b/Example/E04_pwm_demo/libraries/zf_common/zf_common_clock.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_clock * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_common/zf_common_debug.c b/Example/E04_pwm_demo/libraries/zf_common/zf_common_debug.c index 52c623d..d680265 100644 --- a/Example/E04_pwm_demo/libraries/zf_common/zf_common_debug.c +++ b/Example/E04_pwm_demo/libraries/zf_common/zf_common_debug.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_debug * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -46,7 +46,7 @@ static volatile uint8 zf_debug_assert_enable = 1; #if DEBUG_UART_USE_INTERRUPT // 如果启用 debug uart 接收中断 uint8 debug_uart_buffer[DEBUG_RING_BUFFER_LEN]; // 数据存放数组 uint8 debug_uart_data; -fifo_obj_struct debug_uart_fifo; +fifo_struct debug_uart_fifo; #endif //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E04_pwm_demo/libraries/zf_common/zf_common_debug.h b/Example/E04_pwm_demo/libraries/zf_common/zf_common_debug.h index 881a297..4fb4d91 100644 --- a/Example/E04_pwm_demo/libraries/zf_common/zf_common_debug.h +++ b/Example/E04_pwm_demo/libraries/zf_common/zf_common_debug.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_debug * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_common/zf_common_fifo.c b/Example/E04_pwm_demo/libraries/zf_common/zf_common_fifo.c index b010d3e..94f5133 100644 --- a/Example/E04_pwm_demo/libraries/zf_common/zf_common_fifo.c +++ b/Example/E04_pwm_demo/libraries/zf_common/zf_common_fifo.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_fifo * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -45,7 +45,7 @@ // 使用示例 fifo_head_offset(fifo, 1); // 备注信息 本函数在文件内部调用 用户不用关注 也不可修改 //------------------------------------------------------------------------------------------------------------------- -static void fifo_head_offset (fifo_obj_struct *fifo, uint32 offset) +static void fifo_head_offset (fifo_struct *fifo, uint32 offset) { fifo->head += offset; @@ -63,7 +63,7 @@ static void fifo_head_offset (fifo_obj_struct *fifo, uint32 offset) // 使用示例 fifo_end_offset(fifo, 1); // 备注信息 本函数在文件内部调用 用户不用关注 也不可修改 //------------------------------------------------------------------------------------------------------------------- -static void fifo_end_offset (fifo_obj_struct *fifo, uint32 offset) +static void fifo_end_offset (fifo_struct *fifo, uint32 offset) { fifo->end += offset; @@ -80,7 +80,7 @@ static void fifo_end_offset (fifo_obj_struct *fifo, uint32 offset) // 使用示例 fifo_clear(fifo); // 备注信息 清空当前 FIFO 对象的内存 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_clear (fifo_obj_struct *fifo) +fifo_state_enum fifo_clear (fifo_struct *fifo) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -113,7 +113,7 @@ fifo_state_enum fifo_clear (fifo_obj_struct *fifo) // 使用示例 uint32 len = fifo_used(fifo); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 fifo_used (fifo_obj_struct *fifo) +uint32 fifo_used (fifo_struct *fifo) { zf_assert(fifo != NULL); return (fifo->max - fifo->size); // 返回当前 FIFO 缓冲区中数据个数 @@ -127,7 +127,7 @@ uint32 fifo_used (fifo_obj_struct *fifo) // 使用示例 zf_log(fifo_write_element(&fifo, data) == FIFO_SUCCESS, "fifo_write_byte error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat) +fifo_state_enum fifo_write_element (fifo_struct *fifo, uint32 dat) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -171,7 +171,7 @@ fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat) // 使用示例 zf_log(fifo_write_buffer(&fifo, data, 32) == FIFO_SUCCESS, "fifo_write_buffer error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 length) +fifo_state_enum fifo_write_buffer (fifo_struct *fifo, void *dat, uint32 length) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -286,7 +286,7 @@ fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 leng // 使用示例 zf_log(fifo_read_element(&fifo, data, FIFO_READ_ONLY) == FIFO_SUCCESS, "fifo_read_byte error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operation_enum flag) +fifo_state_enum fifo_read_element (fifo_struct *fifo, void *dat, fifo_operation_enum flag) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -348,7 +348,7 @@ fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operat // 使用示例 zf_log(fifo_read_buffer(&fifo, data, &length, FIFO_READ_ONLY) == FIFO_SUCCESS, "fifo_read_buffer error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) +fifo_state_enum fifo_read_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) { zf_assert(NULL != fifo); zf_assert(NULL != length); @@ -447,7 +447,7 @@ fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *leng // 如果使用 FIFO_READ_AND_CLEAN 操作 将会丢弃所有数据并清空整个 FIFO // 如果使用 FIFO_READ_AND_CLEAN 操作 将会丢弃所有数据并清空整个 FIFO //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) +fifo_state_enum fifo_read_tail_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) { zf_assert(NULL != fifo); zf_assert(NULL != length); @@ -541,7 +541,7 @@ fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 // 使用示例 fifo_init(&user_fifo, user_buffer, 64); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_init (fifo_obj_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size) +fifo_state_enum fifo_init (fifo_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; diff --git a/Example/E04_pwm_demo/libraries/zf_common/zf_common_fifo.h b/Example/E04_pwm_demo/libraries/zf_common/zf_common_fifo.h index 5cc7668..901a913 100644 --- a/Example/E04_pwm_demo/libraries/zf_common/zf_common_fifo.h +++ b/Example/E04_pwm_demo/libraries/zf_common/zf_common_fifo.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_fifo * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -91,17 +91,17 @@ typedef struct uint32 end; // 缓存尾指针 总是指向非空缓存(缓存全空除外) uint32 size; // 缓存剩余大小 uint32 max; // 缓存总大小 -}fifo_obj_struct; +}fifo_struct; -fifo_state_enum fifo_clear (fifo_obj_struct *fifo); -uint32 fifo_used (fifo_obj_struct *fifo); +fifo_state_enum fifo_clear (fifo_struct *fifo); +uint32 fifo_used (fifo_struct *fifo); -fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat); -fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 length); -fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operation_enum flag); -fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); -fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); +fifo_state_enum fifo_write_element (fifo_struct *fifo, uint32 dat); +fifo_state_enum fifo_write_buffer (fifo_struct *fifo, void *dat, uint32 length); +fifo_state_enum fifo_read_element (fifo_struct *fifo, void *dat, fifo_operation_enum flag); +fifo_state_enum fifo_read_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); +fifo_state_enum fifo_read_tail_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); -fifo_state_enum fifo_init (fifo_obj_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size); +fifo_state_enum fifo_init (fifo_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size); #endif diff --git a/Example/E04_pwm_demo/libraries/zf_common/zf_common_font.c b/Example/E04_pwm_demo/libraries/zf_common/zf_common_font.c index c816f9d..ee1df09 100644 --- a/Example/E04_pwm_demo/libraries/zf_common/zf_common_font.c +++ b/Example/E04_pwm_demo/libraries/zf_common/zf_common_font.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_font * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_common/zf_common_font.h b/Example/E04_pwm_demo/libraries/zf_common/zf_common_font.h index 24b8602..7531250 100644 --- a/Example/E04_pwm_demo/libraries/zf_common/zf_common_font.h +++ b/Example/E04_pwm_demo/libraries/zf_common/zf_common_font.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_font * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_common/zf_common_function.c b/Example/E04_pwm_demo/libraries/zf_common/zf_common_function.c index d403fb5..acf2739 100644 --- a/Example/E04_pwm_demo/libraries/zf_common/zf_common_function.c +++ b/Example/E04_pwm_demo/libraries/zf_common/zf_common_function.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_function * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_common/zf_common_function.h b/Example/E04_pwm_demo/libraries/zf_common/zf_common_function.h index f5683e1..101b58a 100644 --- a/Example/E04_pwm_demo/libraries/zf_common/zf_common_function.h +++ b/Example/E04_pwm_demo/libraries/zf_common/zf_common_function.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_function * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_common/zf_common_headfile.h b/Example/E04_pwm_demo/libraries/zf_common/zf_common_headfile.h index aa06ef8..86762db 100644 --- a/Example/E04_pwm_demo/libraries/zf_common/zf_common_headfile.h +++ b/Example/E04_pwm_demo/libraries/zf_common/zf_common_headfile.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_headfile * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -82,7 +82,7 @@ //===================================================外接设备驱动层=================================================== #include "zf_device_absolute_encoder.h" #include "zf_device_bluetooth_ch9141.h" -#include "zf_device_gps_tau1201.h" +#include "zf_device_gnss.h" #include "zf_device_camera.h" #include "zf_device_dl1a.h" #include "zf_device_dl1b.h" @@ -108,6 +108,7 @@ //====================================================应用组件层==================================================== #include "seekfree_assistant.h" +#include "seekfree_assistant_interface.h" //====================================================应用组件层==================================================== //=====================================================用户层====================================================== diff --git a/Example/E04_pwm_demo/libraries/zf_common/zf_common_interrupt.c b/Example/E04_pwm_demo/libraries/zf_common/zf_common_interrupt.c index 61058b2..af12fe0 100644 --- a/Example/E04_pwm_demo/libraries/zf_common/zf_common_interrupt.c +++ b/Example/E04_pwm_demo/libraries/zf_common/zf_common_interrupt.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_interrupt * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_common/zf_common_interrupt.h b/Example/E04_pwm_demo/libraries/zf_common/zf_common_interrupt.h index 99b0e53..f828423 100644 --- a/Example/E04_pwm_demo/libraries/zf_common/zf_common_interrupt.h +++ b/Example/E04_pwm_demo/libraries/zf_common/zf_common_interrupt.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_interrupt * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_common/zf_common_typedef.h b/Example/E04_pwm_demo/libraries/zf_common/zf_common_typedef.h index bd09f30..9a07c92 100644 --- a/Example/E04_pwm_demo/libraries/zf_common/zf_common_typedef.h +++ b/Example/E04_pwm_demo/libraries/zf_common/zf_common_typedef.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_typedef * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_components/seekfree_assistant.c b/Example/E04_pwm_demo/libraries/zf_components/seekfree_assistant.c index a196e10..0b7cb9d 100644 --- a/Example/E04_pwm_demo/libraries/zf_components/seekfree_assistant.c +++ b/Example/E04_pwm_demo/libraries/zf_components/seekfree_assistant.c @@ -1,49 +1,71 @@ /********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ -#include "zf_common_fifo.h" + +#include "zf_common_debug.h" + #include "seekfree_assistant.h" -seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 -static seekfree_assistant_camera_struct seekfree_assistant_camera_data; // 图像上位机协议数据 -static seekfree_assistant_camera_dot_struct seekfree_assistant_camera_dot_data; // 图像上位机打点协议数据 -static seekfree_assistant_camera_buffer_struct seekfree_assistant_camera_buffer; // 图像以及边界缓冲区信息 -static fifo_obj_struct seekfree_assistant_fifo; -static uint8 seekfree_assistant_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE]; // 数据存放数组 -float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 保存接收到的参数 -vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 参数更新标志位 +extern uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length); +extern uint32 seekfree_assistant_receive (uint8 *buff, uint32 length); + +#if (1 == SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE) +#include "zf_common_fifo.h" +static uint8 seekfree_assistant_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE]; // FIFO缓冲区 +static fifo_struct seekfree_assistant_fifo = // FIFO结构体 +{ + .buffer = seekfree_assistant_buffer, + .execution = FIFO_IDLE, + .type = FIFO_DATA_8BIT, + .head = 0, + .end = 0, + .size = SEEKFREE_ASSISTANT_BUFFER_SIZE, + .max = SEEKFREE_ASSISTANT_BUFFER_SIZE, +}; +#endif + +static seekfree_assistant_camera_struct seekfree_assistant_camera_data; // 图像上位机协议数据 +static seekfree_assistant_camera_dot_struct seekfree_assistant_camera_dot_data; // 图像上位机打点协议数据 +static seekfree_assistant_camera_buffer_struct seekfree_assistant_camera_buffer; // 图像以及边界缓冲区信息 + +seekfree_assistant_transfer_callback_function seekfree_assistant_transfer_callback = seekfree_assistant_transfer; // 数据发送函数指针 +seekfree_assistant_receive_callback_function seekfree_assistant_receive_callback = seekfree_assistant_receive; // 数据接收函数指针 + +seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 +float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 保存接收到的参数 +vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 参数更新标志位 //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手求和函数 @@ -87,7 +109,7 @@ void seekfree_assistant_camera_data_send (seekfree_assistant_image_type_enum cam seekfree_assistant_camera_data.image_height = height; // 首先发送帧头、功能、摄像头类型、以及宽度高度等信息 - seekfree_assistant_transfer((const uint8 *)&seekfree_assistant_camera_data, sizeof(seekfree_assistant_camera_struct)); + seekfree_assistant_transfer_callback((const uint8 *)&seekfree_assistant_camera_data, sizeof(seekfree_assistant_camera_struct)); // 根据摄像头类型计算图像大小 switch(camera_type) @@ -111,9 +133,8 @@ void seekfree_assistant_camera_data_send (seekfree_assistant_image_type_enum cam // 发送图像数据 if(NULL != image_addr) { - seekfree_assistant_transfer(image_addr, image_size); + seekfree_assistant_transfer_callback(image_addr, image_size); } - } //------------------------------------------------------------------------------------------------------------------- @@ -139,16 +160,15 @@ void seekfree_assistant_camera_dot_send (seekfree_assistant_camera_buffer_struct dot_bytes *= 2; } - // 首先发送帧头、功能、边界编号、坐标长度、点个数 - seekfree_assistant_transfer((const uint8 *)&seekfree_assistant_camera_dot_data, sizeof(seekfree_assistant_camera_dot_struct)); + seekfree_assistant_transfer_callback((const uint8 *)&seekfree_assistant_camera_dot_data, sizeof(seekfree_assistant_camera_dot_struct)); for(i=0; i < SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY; i++) { // 判断是否发送横坐标数据 if(NULL != buffer->boundary_x[i]) { - seekfree_assistant_transfer((const uint8 *)buffer->boundary_x[i], dot_bytes); + seekfree_assistant_transfer_callback((const uint8 *)buffer->boundary_x[i], dot_bytes); } // 判断是否发送纵坐标数据 @@ -156,10 +176,9 @@ void seekfree_assistant_camera_dot_send (seekfree_assistant_camera_buffer_struct { // 如果没有纵坐标数据,则表示每一行只有一个边界 // 指定了横纵坐标数据,这种方式可以实现同一行多个边界的情况,例如搜线算法能够搜索出回弯。 - seekfree_assistant_transfer((const uint8 *)buffer->boundary_y[i], dot_bytes); + seekfree_assistant_transfer_callback((const uint8 *)buffer->boundary_y[i], dot_bytes); } } - } //------------------------------------------------------------------------------------------------------------------- @@ -193,7 +212,7 @@ void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struc // 数据在调用本函数之前,由用户将需要发送的数据写入seekfree_assistant_oscilloscope_data.data[] - seekfree_assistant_transfer((const uint8 *)seekfree_assistant_oscilloscope, packet_size); + seekfree_assistant_transfer_callback((const uint8 *)seekfree_assistant_oscilloscope, packet_size); } //------------------------------------------------------------------------------------------------------------------- @@ -364,12 +383,14 @@ void seekfree_assistant_camera_send (void) } } + //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手解析接收到的数据 // 参数说明 void // 返回参数 void // 使用示例 函数只需要放到周期运行的PIT中断或者主循环即可 //------------------------------------------------------------------------------------------------------------------- +#if (1 == SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE) void seekfree_assistant_data_analysis (void) { uint8 temp_sum; @@ -380,14 +401,13 @@ void seekfree_assistant_data_analysis (void) uint32 temp_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE / 4]; // 尝试读取数据, 如果不是自定义的传输方式则从接收回调中读取数据 - read_length = seekfree_assistant_receive((uint8 *)temp_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); + read_length = seekfree_assistant_receive_callback((uint8 *)temp_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); if(read_length) { // 将读取到的数据写入FIFO fifo_write_buffer(&seekfree_assistant_fifo, (uint8 *)temp_buffer, read_length); } - while(sizeof(seekfree_assistant_parameter_struct) <= fifo_used(&seekfree_assistant_fifo)) { read_length = sizeof(seekfree_assistant_parameter_struct); @@ -416,21 +436,11 @@ void seekfree_assistant_data_analysis (void) } } - // 丢弃无需使用的数据 fifo_read_buffer(&seekfree_assistant_fifo, (uint8 *)temp_buffer, &read_length, FIFO_READ_AND_CLEAN); } } - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 逐飞助手 初始化 -// 参数说明 -// 返回参数 void -// 使用示例 -//------------------------------------------------------------------------------------------------------------------- -ZF_WEAK void seekfree_assistant_init () -{ - fifo_init(&seekfree_assistant_fifo, FIFO_DATA_8BIT, seekfree_assistant_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); -} +#endif + diff --git a/Example/E04_pwm_demo/libraries/zf_components/seekfree_assistant.h b/Example/E04_pwm_demo/libraries/zf_components/seekfree_assistant.h index d02abb1..ae0f67c 100644 --- a/Example/E04_pwm_demo/libraries/zf_components/seekfree_assistant.h +++ b/Example/E04_pwm_demo/libraries/zf_components/seekfree_assistant.h @@ -1,69 +1,75 @@ -/*/********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +/********************************************************************************************************************* +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ #ifndef _seekfree_assistant_h_ #define _seekfree_assistant_h_ #include "zf_common_typedef.h" -#include "zf_common_debug.h" + + +// 1:使能参数调节的功能 0:关闭参数调节的功能 +#define SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE ( 1 ) + + // 定义接收FIFO大小 -#define SEEKFREE_ASSISTANT_BUFFER_SIZE ( 0x80 ) +#define SEEKFREE_ASSISTANT_BUFFER_SIZE ( 0x80 ) + +// 定义示波器的最大通道数量 +#define SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT ( 0x08 ) + +// 定义参数调试的最大通道数量 +#define SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT ( 0x08 ) + +// 定义图像边线最大数量 +#define SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY ( 0x08 ) + +// 单片机往上位机发送的帧头 +#define SEEKFREE_ASSISTANT_SEND_HEAD ( 0xAA ) + +// 摄像头类 +#define SEEKFREE_ASSISTANT_CAMERA_FUNCTION ( 0x02 ) +#define SEEKFREE_ASSISTANT_CAMERA_DOT_FUNCTION ( 0x03 ) +#define SEEKFREE_ASSISTANT_CAMERA_OSCILLOSCOPE ( 0x10 ) + +// 上位机往单片机发送的帧头 +#define SEEKFREE_ASSISTANT_RECEIVE_HEAD ( 0x55 ) + +// 参数设置类 +#define SEEKFREE_ASSISTANT_RECEIVE_SET_PARAMETER ( 0x20 ) -// 定义示波器的最大通道数量 -#define SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT ( 0x08 ) - -// 定义参数调试的最大通道数量 -#define SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT ( 0x08 ) - -// 定义图像边线最大数量 -#define SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY ( 0x08 ) - -// 单片机往上位机发送的帧头 -#define SEEKFREE_ASSISTANT_SEND_HEAD ( 0xAA ) - -// 摄像头类 -#define SEEKFREE_ASSISTANT_CAMERA_FUNCTION ( 0x02 ) -#define SEEKFREE_ASSISTANT_CAMERA_DOT_FUNCTION ( 0x03 ) -#define SEEKFREE_ASSISTANT_CAMERA_OSCILLOSCOPE ( 0x10 ) - -// 上位机往单片机发送的帧头 -#define SEEKFREE_ASSISTANT_RECEIVE_HEAD ( 0x55 ) - -// 参数设置类 -#define SEEKFREE_ASSISTANT_RECEIVE_SET_PARAMETER ( 0x20 ) // 摄像头类型枚举 typedef enum @@ -91,71 +97,69 @@ typedef enum typedef struct { - uint8 head; // 帧头 - uint8 channel_num; // 高四位为功能字 低四位为通道数量 - uint8 check_sum; // 和校验 - uint8 length; // 包长度 - float data[SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT]; // 通道数据 + uint8 head; // 帧头 + uint8 channel_num; // 高四位为功能字 低四位为通道数量 + uint8 check_sum; // 和校验 + uint8 length; // 包长度 + float data[SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT]; // 通道数据 }seekfree_assistant_oscilloscope_struct; typedef struct { - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 camera_type; // 低四位表示边界数量 第四位表示是否有图像数据 例如0x13:其中3表示一副图像有三条边界(通常是左边界、中线、右边界)、1表示没有图像数据 - uint8 length; // 包长度(仅包含协议部分) - uint16 image_width; // 图像宽度 - uint16 image_height; // 图像高度 -}seekfree_assistant_camera_struct; - - -typedef struct -{ - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 dot_type; // 点类型 BIT5:1:坐标是16位的 0:坐标是8位的 BIT7-BIT6:0:只有X坐标 1:只有Y坐标 2:X和Y坐标都有 BIT3-BIT0:边界数量 - uint8 length; // 包长度(仅包含协议部分) - uint16 dot_num; // 画点数量 - uint8 valid_flag; // 通道标识 - uint8 reserve; // 保留 -}seekfree_assistant_camera_dot_struct; - -typedef struct -{ - void *image_addr; // 摄像头地址 - uint16 width; // 图像宽度 - uint16 height; // 图像高度 - seekfree_assistant_image_type_enum camera_type; // 摄像头类型 - void *boundary_x[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界横坐标数组地址 - void *boundary_y[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界纵坐标数组地址 + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 camera_type; // 低四位表示边界数量 第四位表示是否有图像数据 例如0x13:其中3表示一副图像有三条边界(通常是左边界、中线、右边界)、1表示没有图像数据 + uint8 length; // 包长度(仅包含协议部分) + uint16 image_width; // 图像宽度 + uint16 image_height; // 图像高度 +}seekfree_assistant_camera_struct; + + +typedef struct +{ + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 dot_type; // 点类型 BIT5:1:坐标是16位的 0:坐标是8位的 BIT7-BIT6:0:只有X坐标 1:只有Y坐标 2:X和Y坐标都有 BIT3-BIT0:边界数量 + uint8 length; // 包长度(仅包含协议部分) + uint16 dot_num; // 画点数量 + uint8 valid_flag; // 通道标识 + uint8 reserve; // 保留 +}seekfree_assistant_camera_dot_struct; + +typedef struct +{ + void *image_addr; // 摄像头地址 + uint16 width; // 图像宽度 + uint16 height; // 图像高度 + seekfree_assistant_image_type_enum camera_type; // 摄像头类型 + void *boundary_x[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界横坐标数组地址 + void *boundary_y[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界纵坐标数组地址 }seekfree_assistant_camera_buffer_struct; typedef struct { - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 channel; // 通道 - uint8 check_sum; // 和校验 - float data; // 数据 + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 channel; // 通道 + uint8 check_sum; // 和校验 + float data; // 数据 }seekfree_assistant_parameter_struct; +typedef uint32 (*seekfree_assistant_transfer_callback_function) (const uint8 *buff, uint32 length); +typedef uint32 (*seekfree_assistant_receive_callback_function) (uint8 *buff, uint32 length); -extern seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 -extern float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 保存接收到的参数 -extern vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 参数更新标志位 +extern seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 +extern float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 保存接收到的参数 +extern vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 参数更新标志位 + + +void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struct *seekfree_assistant_oscilloscope); +void seekfree_assistant_camera_information_config (seekfree_assistant_image_type_enum camera_type, void *image_addr, uint16 width, uint16 height); +void seekfree_assistant_camera_boundary_config (seekfree_assistant_boundary_type_enum boundary_type, uint16 dot_num, void *dot_x1, void *dot_x2, void *dot_x3, void *dot_y1, void *dot_y2, void *dot_y3); +void seekfree_assistant_camera_send (void); +void seekfree_assistant_data_analysis (void); -uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length); -uint32 seekfree_assistant_receive (uint8 *buff, uint32 length); - -void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struct *seekfree_assistant_oscilloscope); - -void seekfree_assistant_camera_information_config (seekfree_assistant_image_type_enum camera_type, void *image_addr, uint16 width, uint16 height); -void seekfree_assistant_camera_boundary_config (seekfree_assistant_boundary_type_enum boundary_type, uint16 dot_num, void *dot_x1, void *dot_x2, void *dot_x3, void *dot_y1, void *dot_y2, void *dot_y3); -void seekfree_assistant_camera_send (void); - -void seekfree_assistant_data_analysis (void); -void seekfree_assistant_init (void); #endif diff --git a/Example/E04_pwm_demo/libraries/zf_components/seekfree_assistant_interface.c b/Example/E04_pwm_demo/libraries/zf_components/seekfree_assistant_interface.c index 99dbeef..fdade63 100644 --- a/Example/E04_pwm_demo/libraries/zf_components/seekfree_assistant_interface.c +++ b/Example/E04_pwm_demo/libraries/zf_components/seekfree_assistant_interface.c @@ -1,42 +1,55 @@ /********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant_interface * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ #include "zf_common_typedef.h" +#include "zf_common_fifo.h" #include "zf_common_debug.h" +#include "zf_driver_uart.h" +#include "zf_device_wireless_uart.h" +#include "zf_device_bluetooth_ch9141.h" +#include "zf_device_wifi_uart.h" +#include "zf_device_wifi_spi.h" #include "seekfree_assistant.h" +#include "seekfree_assistant_interface.h" + + +extern seekfree_assistant_transfer_callback_function seekfree_assistant_transfer_callback; // 数据发送函数指针 +extern seekfree_assistant_receive_callback_function seekfree_assistant_receive_callback; // 数据接收函数指针 + + //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手发送函数 // 参数说明 *buff 需要发送的数据地址 @@ -46,11 +59,9 @@ //------------------------------------------------------------------------------------------------------------------- ZF_WEAK uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length) { - uint32 len = 0; - - len = debug_send_buffer(buff, length); - - return len; + + // 当选择自定义通讯方式时 需要自行完成数据发送功能 + return length; } //------------------------------------------------------------------------------------------------------------------- @@ -62,11 +73,57 @@ ZF_WEAK uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length) //------------------------------------------------------------------------------------------------------------------- ZF_WEAK uint32 seekfree_assistant_receive (uint8 *buff, uint32 length) { - uint32 len = 0; + // 当选择自定义通讯方式时 需要自行完成数据接收功能 + return 0; +} - len = debug_read_ring_buffer(buff, length); - - return len; +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 逐飞助手接口 初始化 +// 参数说明 +// 返回参数 void +// 使用示例 seekfree_assistant_interface_init(SEEKFREE_ASSISTANT_WIFI_SPI); 使用高速WIFI SPI模块进行数据收发 +// 备注 需要自行调用设备的初始化,例如使用无线转串口进行数据的收发,则需要自行调用无线转串口的初始化,然后再调用seekfree_assistant_interface_init完成逐飞助手的接口初始化 +//------------------------------------------------------------------------------------------------------------------- +ZF_WEAK void seekfree_assistant_interface_init (seekfree_assistant_transfer_device_enum transfer_device) +{ + switch(transfer_device) + { + case SEEKFREE_ASSISTANT_DEBUG_UART: + { + seekfree_assistant_transfer_callback = debug_send_buffer; + seekfree_assistant_receive_callback = debug_read_ring_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIRELESS_UART: + { + seekfree_assistant_transfer_callback = wireless_uart_send_buffer; + seekfree_assistant_receive_callback = wireless_uart_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_CH9141: + { + seekfree_assistant_transfer_callback = bluetooth_ch9141_send_buffer; + seekfree_assistant_receive_callback = bluetooth_ch9141_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIFI_UART: + { + seekfree_assistant_transfer_callback = wifi_uart_send_buffer; + seekfree_assistant_receive_callback = wifi_uart_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIFI_SPI: + { + seekfree_assistant_transfer_callback = wifi_spi_send_buffer; + seekfree_assistant_receive_callback = wifi_spi_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_CUSTOM: + { + // 根据自己的需求 自行实现seekfree_assistant_transfer与seekfree_assistant_receive函数,完成数据的收发 + + }break; + } } diff --git a/Example/E04_pwm_demo/libraries/zf_components/seekfree_assistant_interface.h b/Example/E04_pwm_demo/libraries/zf_components/seekfree_assistant_interface.h new file mode 100644 index 0000000..940b5f7 --- /dev/null +++ b/Example/E04_pwm_demo/libraries/zf_components/seekfree_assistant_interface.h @@ -0,0 +1,57 @@ +/********************************************************************************************************************* +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 +* Copyright (c) 2022 SEEKFREE 逐飞科技 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 +* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 +* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 +* +* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 +* 甚至没有隐含的适销性或适合特定用途的保证 +* 更多细节请参见 GPL +* +* 您应该在收到本开源库的同时收到一份 GPL 的副本 +* 如果没有,请参阅 +* +* 额外注明: +* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 +* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 +* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 +* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) +* +* 文件名称 seekfree_assistant_interface +* 公司名称 成都逐飞科技有限公司 +* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A +* 店铺链接 https://seekfree.taobao.com/ +* +* 修改记录 +* 日期 作者 备注 +* 2024-1-11 SeekFree first version +********************************************************************************************************************/ + +#ifndef _seekfree_assistant_interface_h_ +#define _seekfree_assistant_interface_h_ + + + +// 数据发送设备枚举 +typedef enum +{ + SEEKFREE_ASSISTANT_DEBUG_UART, // 调试串口 使用的串口由DEBUG_UART_INDEX宏定义指定 + SEEKFREE_ASSISTANT_WIRELESS_UART, // 无线转串口 + SEEKFREE_ASSISTANT_CH9141, // CH9141蓝牙 + SEEKFREE_ASSISTANT_WIFI_UART, // WIFI转串口 + SEEKFREE_ASSISTANT_WIFI_SPI, // 高速WIFI SPI + SEEKFREE_ASSISTANT_CUSTOM, // 自定义通讯方式 需要自行seekfree_assistant_transfer与seekfree_assistant_receive函数 +}seekfree_assistant_transfer_device_enum; + + +void seekfree_assistant_interface_init (seekfree_assistant_transfer_device_enum transfer_device); + + + +#endif diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_absolute_encoder.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_absolute_encoder.c index 7c80a3b..f9bc809 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_absolute_encoder.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_absolute_encoder.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_absolute_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_absolute_encoder.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_absolute_encoder.h index e6cc057..ed92906 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_absolute_encoder.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_absolute_encoder.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_absolute_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c index 500bccb..b0a06df 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_bluetooth_ch9141 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -54,7 +54,7 @@ #include "zf_device_camera.h" #include "zf_device_bluetooth_ch9141.h" -static fifo_obj_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 +static fifo_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 static uint8 bluetooth_ch9141_buffer[BLUETOOTH_CH9141_BUFFER_SIZE]; // 数据存放数组 static uint8 bluetooth_ch9141_data = 0; // 数据临时存放变量 diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h index 800be6c..ffb30b5 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h @@ -24,7 +24,7 @@ * 文件名称 main * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_camera.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_camera.c index 84c7aa0..68668c4 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_camera.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_camera.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_camera * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -45,7 +45,7 @@ #include "zf_device_camera.h" -fifo_obj_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 +fifo_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; // 定义摄像头接收数据缓冲区 uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // 定义摄像头数据发送到上位机的帧头 diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_camera.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_camera.h index 58efb06..2cd7d2d 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_camera.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_camera.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_camera * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -44,7 +44,7 @@ //=================================================摄像头公共库 基本配置================================================ #define CAMERA_RECEIVER_BUFFER_SIZE (8) // 定义摄像头接收数据缓冲区大小 -extern fifo_obj_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 +extern fifo_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 extern uint8 camera_send_image_frame_header[4]; // 声明摄像头数据发送到上位机的帧头 //=================================================摄像头公共库 基本配置================================================ diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_config.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_config.h index af6a3d8..6c8147d 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_config.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_config.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_config * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_dl1a.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_dl1a.c index 3e7410c..27be3a7 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_dl1a.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_dl1a.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1a * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_dl1a.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_dl1a.h index 89145d3..3176dd3 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_dl1a.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_dl1a.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1a * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_dl1b.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_dl1b.c index 90e64b3..96e472e 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_dl1b.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_dl1b.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1b * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_dl1b.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_dl1b.h index b144739..922b3ce 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_dl1b.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_dl1b.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1b * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_gps_tau1201.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_gnss.c similarity index 60% rename from Example/E04_pwm_demo/libraries/zf_device/zf_device_gps_tau1201.c rename to Example/E04_pwm_demo/libraries/zf_device/zf_device_gnss.c index da46a99..caf7cd0 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_gps_tau1201.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_gnss.c @@ -21,27 +21,26 @@ * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) * -* 文件名称 zf_device_gps_tau1201 +* 文件名称 zf_device_gnss * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * * 修改记录 -* 日期 作者 备注 -* 2022-09-15 pudding first version -* 2023-04-28 pudding 增加中文注释说明 +* 日期 作者 备注 +* 2023-12-28 pudding first version ********************************************************************************************************************/ -/******************************************************************************************************************** +/********************************************************************************************************************* * 接线定义: -* ------------------------------------ -* 模块管脚 单片机管脚 -* RX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_RX 宏定义 -* TX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_TX 宏定义 -* VCC 3.3V电源 -* GND 电源地 -* ------------------------------------ +* ------------------------------------ +* 模块管脚 单片机管脚 +* RX 查看 zf_device_gnss.h 中 GNSS_RX 宏定义 +* TX 查看 zf_device_gnss.h 中 GNSS_TX 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* ------------------------------------ ********************************************************************************************************************/ #include "math.h" @@ -50,22 +49,24 @@ #include "zf_driver_delay.h" #include "zf_driver_uart.h" -#include "zf_device_gps_tau1201.h" +#include "zf_device_gnss.h" -#define GPS_TAU1201_BUFFER_SIZE ( 128 ) +#define GNSS_BUFFER_SIZE ( 128 ) -uint8 gps_tau1201_flag = 0; // 1:采集完成等待处理数据 0:没有采集完成 -gps_info_struct gps_tau1201; // GPS解析之后的数据 +uint8 gnss_flag = 0; // 1:采集完成等待处理数据 0:没有采集完成 +gnss_info_struct gnss; // GPS解析之后的数据 + +static uint8 gnss_state = 0; // 1:GPS初始化完成 +static fifo_struct gnss_receiver_fifo; // +static uint8 gnss_receiver_buffer[GNSS_BUFFER_SIZE]; // 数据存放数组 -static uint8 gps_tau1201_state = 0; // 1:GPS初始化完成 -static fifo_obj_struct gps_tau1201_receiver_fifo; // -static uint8 gps_tau1201_receiver_buffer[GPS_TAU1201_BUFFER_SIZE]; // 数据存放数组 +static gps_state_enum gnss_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 +static gps_state_enum gnss_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 +static gps_state_enum gnss_ths_state = GPS_STATE_RECEIVING; // rmc 语句状态 -gps_state_enum gps_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 -gps_state_enum gps_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 - -static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; // GGA语句缓冲区 -static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; // RMC语句缓冲区 +static uint8 gps_gga_buffer[GNSS_BUFFER_SIZE]; +static uint8 gps_rmc_buffer[GNSS_BUFFER_SIZE]; +static uint8 gps_ths_buffer[GNSS_BUFFER_SIZE]; //------------------------------------------------------------------------------------------------------------------- // 函数简介 获取指定 ',' 后面的索引 @@ -94,7 +95,7 @@ static uint8 get_parameter_index (uint8 num, char *str) } if(j == num) { - len1 = i + 1; + len1 = i + 1; break; } } @@ -121,7 +122,7 @@ static int get_int_number (char *s) return_value = func_str_to_int(buf); return return_value; } - + //------------------------------------------------------------------------------------------------------------------- // 函数简介 给定字符串第一个 ',' 之前的数据转换为float // 参数说明 *s 字符串 @@ -134,15 +135,15 @@ static float get_float_number (char *s) uint8 i = 0; char buf[15]; float return_value = 0; - + i = get_parameter_index(1, s); i = i - 1; strncpy(buf, s, i); buf[i] = 0; return_value = (float)func_str_to_double(buf); - return return_value; + return return_value; } - + //------------------------------------------------------------------------------------------------------------------- // 函数简介 给定字符串第一个 ',' 之前的数据转换为double // 参数说明 *s 字符串 @@ -155,7 +156,7 @@ static double get_double_number (char *s) uint8 i = 0; char buf[15]; double return_value = 0; - + i = get_parameter_index(1, s); i = i - 1; strncpy(buf, s, i); @@ -168,13 +169,13 @@ static double get_double_number (char *s) // 函数简介 世界时间转换为北京时间 // 参数说明 *time 保存的时间 // 返回参数 void -// 使用示例 utc_to_btc(&gps->time); +// 使用示例 utc_to_btc(&gnss->time); // 备注信息 内部使用 //------------------------------------------------------------------------------------------------------------------- static void utc_to_btc (gps_time_struct *time) { uint8 day_num = 0; - + time->hour = time->hour + 8; if(23 < time->hour) { @@ -197,7 +198,7 @@ static void utc_to_btc (gps_time_struct *time) day_num = 30; } } - + if(time->day > day_num) { time->day = 1; @@ -214,18 +215,18 @@ static void utc_to_btc (gps_time_struct *time) //------------------------------------------------------------------------------------------------------------------- // 函数简介 RMC语句解析 // 参数说明 *line 接收到的语句信息 -// 参数说明 *gps 保存解析后的数据 +// 参数说明 *gnss 保存解析后的数据 // 返回参数 uint8 1:解析成功 0:数据有问题不能解析 -// 使用示例 gps_gnrmc_parse((char *)data_buffer, &gps_tau1201); +// 使用示例 gps_gnrmc_parse((char *)data_buffer, &gnss); // 备注信息 内部使用 //------------------------------------------------------------------------------------------------------------------- -static uint8 gps_gnrmc_parse (char *line, gps_info_struct *gps) +static uint8 gps_gnrmc_parse (char *line, gnss_info_struct *gnss) { uint8 state = 0, temp = 0; - + double latitude = 0; // 纬度 double longitude = 0; // 经度 - + double lati_cent_tmp = 0, lati_second_tmp = 0; double long_cent_tmp = 0, long_second_tmp = 0; float speed_tmp = 0; @@ -234,47 +235,50 @@ static uint8 gps_gnrmc_parse (char *line, gps_info_struct *gps) state = buf[get_parameter_index(2, buf)]; - gps->state = 0; if('A' == state) // 如果数据有效 则解析数据 { return_state = 1; - gps->state = 1; - gps -> ns = buf[get_parameter_index(4, buf)]; - gps -> ew = buf[get_parameter_index(6, buf)]; + gnss->state = 1; + gnss -> ns = buf[get_parameter_index(4, buf)]; + gnss -> 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; // 纬度转换为度分秒 - lati_cent_tmp = (latitude - gps->latitude_degree * 100); - gps->latitude_cent = (int)lati_cent_tmp; - lati_second_tmp = (lati_cent_tmp - gps->latitude_cent) * 6000; - gps->latitude_second = (int)lati_second_tmp; + gnss->latitude_degree = (int)latitude / 100; // 纬度转换为度分秒 + lati_cent_tmp = (latitude - gnss->latitude_degree * 100); + gnss->latitude_cent = (int)lati_cent_tmp; + lati_second_tmp = (lati_cent_tmp - gnss->latitude_cent) * 6000; + gnss->latitude_second = (int)lati_second_tmp; - gps->longitude_degree = (int)longitude / 100; // 经度转换为度分秒 - long_cent_tmp = (longitude - gps->longitude_degree * 100); - gps->longitude_cent = (int)long_cent_tmp; - long_second_tmp = (long_cent_tmp - gps->longitude_cent) * 6000; - gps->longitude_second = (int)long_second_tmp; + gnss->longitude_degree = (int)longitude / 100; // 经度转换为度分秒 + long_cent_tmp = (longitude - gnss->longitude_degree * 100); + gnss->longitude_cent = (int)long_cent_tmp; + long_second_tmp = (long_cent_tmp - gnss->longitude_cent) * 6000; + gnss->longitude_second = (int)long_second_tmp; - gps->latitude = gps->latitude_degree + lati_cent_tmp / 60; - gps->longitude = gps->longitude_degree + long_cent_tmp / 60; + gnss->latitude = gnss->latitude_degree + lati_cent_tmp / 60; + gnss->longitude = gnss->longitude_degree + long_cent_tmp / 60; speed_tmp = get_float_number(&buf[get_parameter_index(7, buf)]); // 速度(海里/小时) - gps->speed = speed_tmp * 1.85f; // 转换为公里/小时 - gps->direction = get_float_number(&buf[get_parameter_index(8, buf)]); // 角度 + gnss->speed = speed_tmp * 1.85f; // 转换为公里/小时 + gnss->direction = get_float_number(&buf[get_parameter_index(8, buf)]); // 角度 + } + else + { + gnss->state = 0; } // 在定位没有生效前也是有时间数据的,可以直接解析 - gps->time.hour = (buf[7] - '0') * 10 + (buf[8] - '0'); // 时间 - gps->time.minute = (buf[9] - '0') * 10 + (buf[10] - '0'); - gps->time.second = (buf[11] - '0') * 10 + (buf[12] - '0'); + gnss->time.hour = (buf[7] - '0') * 10 + (buf[8] - '0'); // 时间 + gnss->time.minute = (buf[9] - '0') * 10 + (buf[10] - '0'); + gnss->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'); // 日期 - 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; + gnss->time.day = (buf[temp + 0] - '0') * 10 + (buf[temp + 1] - '0'); // 日期 + gnss->time.month = (buf[temp + 2] - '0') * 10 + (buf[temp + 3] - '0'); + gnss->time.year = (buf[temp + 4] - '0') * 10 + (buf[temp + 5] - '0') + 2000; - utc_to_btc(&gps->time); + utc_to_btc(&gnss->time); return return_state; } @@ -282,12 +286,12 @@ static uint8 gps_gnrmc_parse (char *line, gps_info_struct *gps) //------------------------------------------------------------------------------------------------------------------- // 函数简介 GGA语句解析 // 参数说明 *line 接收到的语句信息 -// 参数说明 *gps 保存解析后的数据 +// 参数说明 *gnss 保存解析后的数据 // 返回参数 uint8 1:解析成功 0:数据有问题不能解析 -// 使用示例 gps_gngga_parse((char *)data_buffer, &gps_tau1201); +// 使用示例 gps_gngga_parse((char *)data_buffer, &gnss); // 备注信息 内部使用 //------------------------------------------------------------------------------------------------------------------- -static uint8 gps_gngga_parse (char *line, gps_info_struct *gps) +static uint8 gps_gngga_parse (char *line, gnss_info_struct *gnss) { uint8 state = 0; char *buf = line; @@ -297,11 +301,41 @@ static uint8 gps_gngga_parse (char *line, gps_info_struct *gps) 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)]); // 高度 = 海拔高度 + 地球椭球面相对大地水准面的高度 + gnss->satellite_used = (uint8)get_int_number(&buf[get_parameter_index(7, buf)]); + gnss->height = get_float_number(&buf[get_parameter_index(9, buf)]) + get_float_number(&buf[get_parameter_index(11, buf)]); // 高度 = 海拔高度 + 地球椭球面相对大地水准面的高度 return_state = 1; } + + return return_state; +} +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 THS语句解析 +// 参数说明 *line 接收到的语句信息 +// 参数说明 *gnss 保存解析后的数据 +// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 +// 使用示例 gps_gnths_parse((char *)data_buffer, &gnss); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 gps_gnths_parse (char *line, gnss_info_struct *gnss) +{ + uint8 state = 0; + char *buf = line; + uint8 return_state = 0; + + state = buf[get_parameter_index(2, buf)]; + + if('A' == state) + { + gnss->antenna_direction_state = 1; + gnss->antenna_direction = get_float_number(&buf[get_parameter_index(1, buf)]); + return_state = 1; + } + else + { + gnss->antenna_direction_state = 0; + } + return return_state; } @@ -316,7 +350,7 @@ static uint8 gps_gngga_parse (char *line, gps_info_struct *gps) // 备注信息 //------------------------------------------------------------------------------------------------------------------- double get_two_points_distance (double latitude1, double longitude1, double latitude2, double longitude2) -{ +{ const double EARTH_RADIUS = 6378137; // 地球半径(单位:m) double rad_latitude1 = 0; double rad_latitude2 = 0; @@ -325,7 +359,7 @@ double get_two_points_distance (double latitude1, double longitude1, double lati double distance = 0; double a = 0; double b = 0; - + rad_latitude1 = ANGLE_TO_RAD(latitude1); // 根据角度计算弧度 rad_latitude2 = ANGLE_TO_RAD(latitude2); rad_longitude1 = ANGLE_TO_RAD(longitude1); @@ -335,9 +369,9 @@ double get_two_points_distance (double latitude1, double longitude1, double lati 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 里面实现的算法 - distance = distance * EARTH_RADIUS; + distance = distance * EARTH_RADIUS; - return distance; + return distance; } //------------------------------------------------------------------------------------------------------------------- @@ -370,7 +404,7 @@ double get_two_points_azimuth (double latitude1, double longitude1, double latit // 使用示例 gps_data_parse(); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint8 gps_data_parse (void) +uint8 gnss_data_parse (void) { uint8 return_state = 0; uint8 check_buffer[5] = {'0', 'x', 0x00, 0x00, 0x00}; @@ -380,9 +414,9 @@ uint8 gps_data_parse (void) do { - if(GPS_STATE_RECEIVED == gps_rmc_state) + if(GPS_STATE_RECEIVED == gnss_rmc_state) { - gps_rmc_state = GPS_STATE_PARSING; + gnss_rmc_state = GPS_STATE_PARSING; strncpy((char *)&check_buffer[2], strchr((const char *)gps_rmc_buffer, '*') + 1, 2); bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); for(bbc_xor_calculation = gps_rmc_buffer[1], data_len = 2; '*' != gps_rmc_buffer[data_len]; data_len ++) @@ -395,17 +429,17 @@ uint8 gps_data_parse (void) return_state = 1; break; } - - gps_gnrmc_parse((char *)gps_rmc_buffer, &gps_tau1201); + + gps_gnrmc_parse((char *)gps_rmc_buffer, &gnss); } - gps_rmc_state = GPS_STATE_RECEIVING; - - if(GPS_STATE_RECEIVED == gps_gga_state) + gnss_rmc_state = GPS_STATE_RECEIVING; + + if(GPS_STATE_RECEIVED == gnss_gga_state) { - gps_gga_state = GPS_STATE_PARSING; + gnss_gga_state = GPS_STATE_PARSING; strncpy((char *)&check_buffer[2], strchr((const char *)gps_gga_buffer, '*') + 1, 2); bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); - + for(bbc_xor_calculation = gps_gga_buffer[1], data_len = 2; '*' != gps_gga_buffer[data_len]; data_len ++) { bbc_xor_calculation ^= gps_gga_buffer[data_len]; @@ -416,11 +450,32 @@ uint8 gps_data_parse (void) return_state = 1; break; } - - gps_gngga_parse((char *)gps_gga_buffer, &gps_tau1201); + + gps_gngga_parse((char *)gps_gga_buffer, &gnss); } - gps_gga_state = GPS_STATE_RECEIVING; - + gnss_gga_state = GPS_STATE_RECEIVING; + + if(GPS_STATE_RECEIVED == gnss_ths_state) + { + gnss_ths_state = GPS_STATE_PARSING; + strncpy((char *)&check_buffer[2], strchr((const char *)gps_ths_buffer, '*') + 1, 2); + bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); + + for(bbc_xor_calculation = gps_ths_buffer[1], data_len = 2; '*' != gps_ths_buffer[data_len]; data_len ++) + { + bbc_xor_calculation ^= gps_ths_buffer[data_len]; + } + if(bbc_xor_calculation != bbc_xor_origin) + { + // 数据校验失败 + return_state = 1; + break; + } + + gps_gnths_parse((char *)gps_ths_buffer, &gnss); + } + gnss_ths_state = GPS_STATE_RECEIVING; + }while(0); return return_state; } @@ -433,51 +488,64 @@ uint8 gps_data_parse (void) // 使用示例 gps_uart_callback(); // 备注信息 此函数需要在串口接收中断内进行调用 //------------------------------------------------------------------------------------------------------------------- -void gps_uart_callback (void) +void gnss_uart_callback (void) { uint8 temp_gps[6]; uint32 temp_length = 0; - if(gps_tau1201_state) + + + + if(gnss_state) { uint8 dat; - while(uart_query_byte(GPS_TAU1201_UART, &dat)) + while(uart_query_byte(GNSS_UART, &dat)) { - fifo_write_buffer(&gps_tau1201_receiver_fifo, &dat, 1); + fifo_write_buffer(&gnss_receiver_fifo, &dat, 1); } - + if('\n' == dat) { // 读取前6个数据 用于判断语句类型 temp_length = 6; - fifo_read_buffer(&gps_tau1201_receiver_fifo, temp_gps, &temp_length, FIFO_READ_ONLY); - + fifo_read_buffer(&gnss_receiver_fifo, temp_gps, &temp_length, FIFO_READ_ONLY); + // 根据不同类型将数据拷贝到不同的缓冲区 if(0 == strncmp((char *)&temp_gps[3], "RMC", 3)) { // 如果没有在解析数据则更新缓冲区的数据 - if(GPS_STATE_PARSING != gps_rmc_state) + if(GPS_STATE_PARSING != gnss_rmc_state) { - gps_rmc_state = GPS_STATE_RECEIVED; - temp_length = fifo_used(&gps_tau1201_receiver_fifo); - fifo_read_buffer(&gps_tau1201_receiver_fifo, gps_rmc_buffer, &temp_length, FIFO_READ_AND_CLEAN); + gnss_rmc_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_rmc_buffer, &temp_length, FIFO_READ_AND_CLEAN); } } else if(0 == strncmp((char *)&temp_gps[3], "GGA", 3)) { // 如果没有在解析数据则更新缓冲区的数据 - if(GPS_STATE_PARSING != gps_gga_state) + if(GPS_STATE_PARSING != gnss_gga_state) { - gps_gga_state = GPS_STATE_RECEIVED; - temp_length = fifo_used(&gps_tau1201_receiver_fifo); - fifo_read_buffer(&gps_tau1201_receiver_fifo, gps_gga_buffer, &temp_length, FIFO_READ_AND_CLEAN); + gnss_gga_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_gga_buffer, &temp_length, FIFO_READ_AND_CLEAN); } } - + else if(0 == strncmp((char *)&temp_gps[3], "THS", 3)) + { + // 如果没有在解析数据则更新缓冲区的数据 + if(GPS_STATE_PARSING != gnss_ths_state) + { + gnss_ths_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_ths_buffer, &temp_length, FIFO_READ_AND_CLEAN); + } + } + // 统一将FIFO清空 - fifo_clear(&gps_tau1201_receiver_fifo); + fifo_clear(&gnss_receiver_fifo); - gps_tau1201_flag = 1; + gnss_flag = 1; } } } @@ -489,12 +557,12 @@ void gps_uart_callback (void) // 使用示例 gps_init(); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -void gps_init (void) +void gnss_init (gps_device_enum gps_device) { 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}; @@ -504,38 +572,49 @@ void gps_init (void) 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}; + + if((TAU1201 == gps_device) || (GN42A == gps_device)) + { + fifo_init(&gnss_receiver_fifo, FIFO_DATA_8BIT, gnss_receiver_buffer, GNSS_BUFFER_SIZE); + system_delay_ms(500); // 等待GPS启动后开始初始化 + uart_init(GNSS_UART, 115200, GNSS_RX, GNSS_TX); - fifo_init(&gps_tau1201_receiver_fifo, FIFO_DATA_8BIT, gps_tau1201_receiver_buffer, GPS_TAU1201_BUFFER_SIZE); - system_delay_ms(500); // 等待GPS启动后开始初始化 - uart_init(GPS_TAU1201_UART, 115200, GPS_TAU1201_RX, GPS_TAU1201_TX); - uart_rx_interrupt(GPS_TAU1201_UART, 0); + uart_write_buffer(GNSS_UART, (uint8 *)set_rate, sizeof(set_rate)); // 设置GPS更新速率为10hz 如果不调用此语句则默认为1hz + system_delay_ms(200); + + uart_write_buffer(GNSS_UART, (uint8 *)open_rmc, sizeof(open_rmc)); // 开启rmc语句 + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)open_gga, sizeof(open_gga)); // 开启gga语句 + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gll, sizeof(close_gll)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gsa, sizeof(close_gsa)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_grs, sizeof(close_grs)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gsv, sizeof(close_gsv)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_vtg, sizeof(close_vtg)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_zda, sizeof(close_zda)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gst, sizeof(close_gst)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_txt, sizeof(close_txt)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_txt_ant, sizeof(close_txt_ant)); + system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)set_rate, sizeof(set_rate)); // 设置GPS更新速率为10hz 如果不调用此语句则默认为1hz - system_delay_ms(200); - - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)open_rmc, sizeof(open_rmc)); // 开启rmc语句 - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)open_gga, sizeof(open_gga)); // 开启gga语句 - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gll, sizeof(close_gll)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gsa, sizeof(close_gsa)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_grs, sizeof(close_grs)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gsv, sizeof(close_gsv)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_vtg, sizeof(close_vtg)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_zda, sizeof(close_zda)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gst, sizeof(close_gst)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_txt, sizeof(close_txt)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_txt_ant, sizeof(close_txt_ant)); - system_delay_ms(50); - - gps_tau1201_state = 1; - uart_rx_interrupt(GPS_TAU1201_UART, 1); + gnss_state = 1; + uart_rx_interrupt(GNSS_UART, 1); + } + else if(GN43RFA == gps_device) + { + // GN43RFA RTK模块不需要进行参数设置,如果需要修改参数应该使用专用的上位机修改参数 + fifo_init(&gnss_receiver_fifo, FIFO_DATA_8BIT, gnss_receiver_buffer, GNSS_BUFFER_SIZE); + uart_init(GNSS_UART, 115200, GNSS_RX, GNSS_TX); + gnss_state = 1; + uart_rx_interrupt(GNSS_UART, 1); + } + } diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_gnss.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_gnss.h new file mode 100644 index 0000000..5d58976 --- /dev/null +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_gnss.h @@ -0,0 +1,125 @@ +/********************************************************************************************************************* +* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* Copyright (c) 2022 SEEKFREE 逐飞科技 +* +* 本文件是 TC264 开源库的一部分 +* +* TC264 开源库 是免费软件 +* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 +* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 +* +* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 +* 甚至没有隐含的适销性或适合特定用途的保证 +* 更多细节请参见 GPL +* +* 您应该在收到本开源库的同时收到一份 GPL 的副本 +* 如果没有,请参阅 +* +* 额外注明: +* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 +* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 +* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 +* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) +* +* 文件名称 zf_device_gnss +* 公司名称 成都逐飞科技有限公司 +* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 +* 开发环境 ADS v1.9.20 +* 适用平台 TC264D +* 店铺链接 https://seekfree.taobao.com/ +* +* 修改记录 +* 日期 作者 备注 +* 2023-12-28 pudding first version +********************************************************************************************************************/ +/********************************************************************************************************************* +* 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* RX 查看 zf_device_gnss.h 中 GNSS_RX 宏定义 +* TX 查看 zf_device_gnss.h 中 GNSS_TX 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* ------------------------------------ +********************************************************************************************************************/ + +#ifndef _zf_device_gnss_h_ +#define _zf_device_gnss_h_ + +#include "zf_common_typedef.h" + +//-------------------------------------------------------------------------------------------------- +//引脚配置 +//-------------------------------------------------------------------------------------------------- +#define GNSS_UART (UART_3) +#define GNSS_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 +#define GNSS_TX (UART3_RX_P15_7) // GPS TX串口引脚 + +#define ANGLE_TO_RAD(x) ( (x) * PI / 180.0 ) // 角度转换为弧度 +#define RAD_TO_ANGLE(x) ( (x) * 180.0 / PI ) // 弧度转换为角度 +#define PI ( 3.1415926535898 ) + +typedef enum +{ + TAU1201 = 1, // 逐飞科技双频GPS模块 + GN42A = 1, // 逐飞科技双频GPS模块 与TAU1201是一样的 + GN43RFA = 2, // 逐飞科技三频RTK模块 +}gps_device_enum; + +typedef struct +{ + uint16 year; + uint8 month; + uint8 day; + uint8 hour; + uint8 minute; + uint8 second; +}gps_time_struct; + +typedef struct +{ + gps_time_struct time; // 时间 + + uint8 state; // 有效状态 1:定位有效 0:定位无效 + + uint16 latitude_degree; // 度 + uint16 latitude_cent; // 分 + uint16 latitude_second; // 秒 这里的秒是被放大了100倍的,主要是避免使用浮点数 + uint16 longitude_degree; // 度 + uint16 longitude_cent; // 分 + uint16 longitude_second; // 秒 这里的秒是被放大了100倍的,主要是避免使用浮点数 + + double latitude; // 纬度 + double longitude; // 经度 + + int8 ns; // 纬度半球 N(北半球)或 S(南半球) + int8 ew; // 经度半球 E(东经)或 W(西经) + + float speed; // 速度(公里/每小时) + float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准)+ + uint8 antenna_direction_state; // 双天线测向有效状态 1:测向有效 0:测向无效,无效时antenna_direction数据是无效的 + float antenna_direction; // 主天线指向从天线与真北构成的夹角(000.0~359.9 度) + + // 下面两个个信息从GNGGA语句中获取 + uint8 satellite_used; // 用于定位的卫星数量 + float height; // 高度 +}gnss_info_struct; + +typedef enum +{ + GPS_STATE_RECEIVING, // 正在接收数据 + GPS_STATE_RECEIVED, // 数据接收完成 + GPS_STATE_PARSING, // 正在解析 +}gps_state_enum; + +extern gnss_info_struct gnss; +extern uint8 gnss_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); +uint8 gnss_data_parse (void); +void gnss_uart_callback (void); +void gnss_init (gps_device_enum gps_device); + +#endif diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_gps_tau1201.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_gps_tau1201.h deleted file mode 100644 index c167bae..0000000 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_gps_tau1201.h +++ /dev/null @@ -1,117 +0,0 @@ -/********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 -* Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 -* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 -* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* -* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 -* 甚至没有隐含的适销性或适合特定用途的保证 -* 更多细节请参见 GPL -* -* 您应该在收到本开源库的同时收到一份 GPL 的副本 -* 如果没有,请参阅 -* -* 额外注明: -* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 -* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 -* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 -* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* -* 文件名称 zf_device_gps_tau1201 -* 公司名称 成都逐飞科技有限公司 -* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D -* 店铺链接 https://seekfree.taobao.com/ -* -* 修改记录 -* 日期 作者 备注 -* 2022-09-15 pudding first version -* 2023-04-28 pudding 增加中文注释说明 -********************************************************************************************************************/ -/******************************************************************************************************************** -* 接线定义: -* ------------------------------------ -* 模块管脚 单片机管脚 -* RX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_RX 宏定义 -* TX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_TX 宏定义 -* VCC 3.3V电源 -* GND 电源地 -* ------------------------------------ -********************************************************************************************************************/ - -#ifndef _zf_device_gps_tau1201_h_ -#define _zf_device_gps_tau1201_h_ - -#include "zf_common_typedef.h" - -//=================================================定义 定位模块 基本配置================================================ -#define GPS_TAU1201_UART (UART_3) -#define GPS_TAU1201_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 -#define GPS_TAU1201_TX (UART3_RX_P15_7) // GPS TX串口引脚 - -#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 -#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 -#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; // 时间- - uint8 state; // 有效状态 1:定位有效 0:定位无效 - uint16 latitude_degree; // 度 - uint16 latitude_cent; // 分 - uint16 latitude_second; // 秒 - uint16 longitude_degree; // 度 - uint16 longitude_cent; // 分 - uint16 longitude_second; // 秒 - double latitude; // 纬度 - double longitude; // 经度 - int8 ns; // 纬度半球 N(北半球)或 S(南半球) - int8 ew; // 经度半球 E(东经)或 W(西经) - float speed; // 速度(公里/每小时) - float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) - // 下面两个个信息从GNGGA语句中获取 - uint8 satellite_used; // 用于定位的卫星数量 - float height; // 高度 -}gps_info_struct; - -typedef enum -{ - GPS_STATE_RECEIVING, // 正在接收数据 - GPS_STATE_RECEIVED, // 数据接收完成 - GPS_STATE_PARSING, // 正在解析 -}gps_state_enum; -//================================================定义 定位模块 参数结构体================================================ - - -//=================================================声明 定位模块 全局变量================================================ -extern gps_info_struct gps_tau1201; // GPS解析之后的数据 -extern uint8 gps_tau1201_flag; // 1:采集完成等待处理数据 0:没有采集完成 -//=================================================声明 定位模块 全局变量================================================ - - -//=================================================声明 定位模块 基础函数================================================ -double get_two_points_distance (double lat1, double lng1, double lat2, double lng2); // 计算从第一个点到第二个点的距离(单位:m) -double get_two_points_azimuth (double lat1, double lon1, double lat2, double lon2); // 计算从第一个点到第二个点的方位角(单位:°) -uint8 gps_data_parse (void); // 解析GPS数据 -void gps_uart_callback (void); // GPS回调函数 -void gps_init (void); // GPS初始化 -//=================================================声明 定位模块 基础函数================================================ -#endif diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_icm20602.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_icm20602.c index f4ae830..ddebf3c 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_icm20602.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_icm20602.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_icm20602 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_icm20602.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_icm20602.h index 67724ad..209972b 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_icm20602.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_icm20602.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_icm20602 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_imu660ra.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_imu660ra.c index 95144f9..02fdb9e 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_imu660ra.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_imu660ra.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu660ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_imu660ra.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_imu660ra.h index a689df1..348e6a1 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_imu660ra.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_imu660ra.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu660ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_imu963ra.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_imu963ra.c index 92ec0f6..595142a 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_imu963ra.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_imu963ra.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu963ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_imu963ra.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_imu963ra.h index 4d0d9f9..c0f981f 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_imu963ra.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_imu963ra.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu963ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_ips114.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_ips114.c index 78c6f3b..b13e338 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_ips114.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_ips114.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips114 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_ips114.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_ips114.h index 81dfc3c..ba932b1 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_ips114.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_ips114.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips114 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_ips200.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_ips200.c index cd8681f..37d9d04 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_ips200.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_ips200.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips200 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_ips200.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_ips200.h index ce59927..045bf27 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_ips200.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_ips200.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips200 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_key.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_key.c index 9e42c8a..8b240cb 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_key.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_key.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_key * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_key.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_key.h index bcab8aa..9c653cf 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_key.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_key.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_key * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_mpu6050.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_mpu6050.c index dc3c5b2..101a5ae 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_mpu6050.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_mpu6050.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_mpu6050 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_mpu6050.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_mpu6050.h index 3510e06..c8a086f 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_mpu6050.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_mpu6050.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_mpu6050 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_mt9v03x.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_mt9v03x.c index 231cfec..d38b8df 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_mt9v03x.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_mt9v03x.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_mt9v03x * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_mt9v03x.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_mt9v03x.h index 7786bc5..9d4650d 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_mt9v03x.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_mt9v03x.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_mt9v03x * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_oled.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_oled.c index 5314209..55aefa7 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_oled.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_oled.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_oled * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_oled.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_oled.h index d52d2fd..aadf048 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_oled.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_oled.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_oled * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_ov7725.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_ov7725.c index 12f6095..bac95fe 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_ov7725.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_ov7725.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ov7725 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_ov7725.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_ov7725.h index f45a4e8..2cb4026 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_ov7725.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_ov7725.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ov7725 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_scc8660.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_scc8660.c index 3483c93..38d65ff 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_scc8660.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_scc8660.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_scc8660 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_scc8660.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_scc8660.h index 815d272..537283a 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_scc8660.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_scc8660.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_scc8660 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_tft180.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_tft180.c index db50824..b661e91 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_tft180.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_tft180.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_tft180 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_tft180.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_tft180.h index 47491ee..54a72b3 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_tft180.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_tft180.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_tft180 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_tsl1401.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_tsl1401.c index 3f9db7f..d133c7c 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_tsl1401.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_tsl1401.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_tsl1401 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_tsl1401.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_tsl1401.h index 1fab12e..a7b061c 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_tsl1401.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_tsl1401.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_tsl1401 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_type.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_type.c index 497ba55..af24701 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_type.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_type.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_type * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -32,6 +32,7 @@ * 日期 作者 备注 * 2022-09-15 pudding first version * 2023-05-26 pudding 新增SPI WIFI 中断回调指针 +* 2024-01-16 pudding 移除SPI WIFI 中断回调指针 SPI WIFI将不再使用外部 ********************************************************************************************************************/ #include "zf_device_type.h" @@ -45,7 +46,6 @@ callback_function camera_dma_handler = type_default_callback; wireless_type_enum wireless_type = NO_WIRELESS; callback_function wireless_module_uart_handler = type_default_callback; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 -callback_function wireless_module_spi_handler = type_default_callback; // WIFI SPI GPIO中断函数指针,根据初始化时设置的函数进行跳转 tof_type_enum tof_type = NO_TOF; callback_function tof_module_exti_handler = type_default_callback; // ToF 模块 INT 更新中断 @@ -54,7 +54,7 @@ callback_function tof_module_exti_handler = type_default_callback; // 函数简介 默认回调函数 // 参数说明 void // 返回参数 void -// 使用示例 +// 使用示例 // 备注信息 保护性冗余设计 防止在没有初始化设备的时候跑飞 //------------------------------------------------------------------------------------------------------------------- static void type_default_callback (void) @@ -90,14 +90,7 @@ void set_camera_type (camera_type_enum type_set, callback_function vsync_callba void set_wireless_type (wireless_type_enum type_set, callback_function wireless_callback) { wireless_type = type_set; - if(WIFI_SPI == wireless_type) - { - wireless_module_spi_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); - } - else - { - wireless_module_uart_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); - } + wireless_module_uart_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); } //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_type.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_type.h index 19c36ca..3b124fe 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_type.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_type.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_type * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -56,7 +56,6 @@ typedef enum WIRELESS_UART, // 无线串口 BLUETOOTH_CH9141, // 蓝牙 CH9141 WIFI_UART, // 串口 WiFi - WIFI_SPI // SPI WiFi }wireless_type_enum; typedef enum diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c index 2bdb164..3cbc786 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_virtual_oscilloscope * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h index f518026..b0fd085 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_virtual_oscilloscope * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_wifi_spi.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_wifi_spi.c index 78a6d68..f9e51ca 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_wifi_spi.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_wifi_spi.c @@ -24,14 +24,13 @@ * 文件名称 zf_device_wifi_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 * 日期 作者 备注 -* 2023-05-27 pudding first version -* 2023-05-29 pudding 新增关闭休眠指令,提升通讯效率 +* 2022-09-21 SeekFree first version ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,1374 +52,615 @@ #include "zf_common_clock.h" #include "zf_common_debug.h" #include "zf_common_fifo.h" -#include "zf_common_function.h" #include "zf_driver_delay.h" #include "zf_driver_gpio.h" -#include "zf_common_interrupt.h" -#include "zf_driver_exti.h" #include "zf_driver_spi.h" #include "zf_device_type.h" #include "zf_device_wifi_spi.h" -#define WAIT_TIME_OUT (10000) // 单指令等待时间 单位:ms +#define WIFI_CONNECT_TIME_OUT 10000 // 单位毫秒 +#define SOCKET_CONNECT_TIME_OUT 50000 // 单位毫秒 +#define OTHER_TIME_OUT 1000 // 单位毫秒 -#define WIFI_SPI_WRITE_MAX 128 // 定义一次SPI通讯最大发送的数据长度 - -#define WIFI_SPI_WRITE_REQUEST 0x01 -#define WIFI_SPI_CHECK_STATE 0x02 -#define WIFI_SPI_WRITE_DATA 0x03 -#define WIFI_SPI_READ_DATA 0x04 -#define WIFI_SPI_WRITE_END 0x07 -#define WIFI_SPI_READ_END 0x08 - -#define WIFI_SPI_WRITE_ADDR 0x00 -#define WIFI_SPI_STATE_ADDR 0x04 +char wifi_spi_version[12]; // 保存模块固件版本信息 +char wifi_spi_mac_addr[20]; // 保存模块MAC地址信息 +char wifi_spi_ip_addr_port[25]; // 保存模块IP地址与端口信息 -volatile wifi_spi_buffer_state_enum wifi_buffer_state; -volatile wifi_spi_transmit_state_enum wifi_transmit_state; - -static fifo_obj_struct wifi_spi_fifo; -static uint8 wifi_spi_buffer[WIFI_SPI_BUFFER_SIZE]; // 数据存放数组 - -vuint8 wifi_spi_ack_flag = 0; // 0:模块未应答 1:模块已应答 -uint8 wifi_spi_init_flag; // 0:模块未初始化成功或者未连接 1:模块已连接并成功初始化 -vuint8 wifi_spi_packet_num; // 发送的数据包ID -vuint32 wifi_spi_send_remain_length; // 剩余的发送长度 - - - -wifi_spi_information_struct wifi_spi_information; +static fifo_struct wifi_spi_fifo; +static uint8 wifi_spi_buffer[WIFI_SPI_RECVIVE_FIFO_SIZE]; +static volatile wifi_spi_state_enum wifi_spi_mutex; //------------------------------------------------------------------------------------------------------------------- -// 函数简介 请求写入数据到模块 -// 参数说明 length 需要写入的长度 -// @return void -// Sample usage: +// 函数简介 等待WIFI SPI就绪 +// 参数说明 wait_time 最大等待时间 单位毫秒 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_write_request(uint16 length) +static uint8 wifi_spi_wait_idle (uint32 wait_time) { - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_REQUEST; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - head.magic = 0xFE; - head.sequence = wifi_spi_packet_num++; - head.length = length; + uint32 time = 0; - wifi_transmit_state = TRANSMIT_WRITE_REQUEST; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 7); - gpio_set_level(WIFI_SPI_CS_PIN, 1); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 读取模块状态 -// 参数说明 *length 需要读取或者写入的长度 -// @return WIFI_SPI_BUFFER_STATE_enum 模块状态 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static wifi_spi_buffer_state_enum wifi_spi_read_state(uint16 *length) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_CHECK_STATE; - head.addr = WIFI_SPI_STATE_ADDR; - head.dummy = 0x00; - - wifi_spi_ack_flag = 0; - wifi_transmit_state = TRANSMIT_READ_STATE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_transfer_8bit(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, &head.cmd, 7); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - - if(BUFFER_WRITE == head.magic) + wait_time = wait_time*100; + while(0 == gpio_get_level(WIFI_SPI_INT_PIN)) { - wifi_spi_packet_num = head.sequence; - } - *length = head.length; - - return (wifi_spi_buffer_state_enum)head.magic; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据发送完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_done(void) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_END; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_transmit_state = TRANSMIT_IDLE; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据接收完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_start(void) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_READ_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - wifi_transmit_state = TRANSMIT_READ; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据接收完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_done(void) -{ - wifi_spi_buffer_struct head; - - gpio_set_level(WIFI_SPI_CS_PIN, 1); - - head.cmd = WIFI_SPI_READ_END; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_transmit_state = TRANSMIT_IDLE; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块 -// 参数说明 *buff 需要写入数据的首地址 -// 参数说明 length 需要写入数据的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_data(const uint8 *buff, uint16 length) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - wifi_transmit_state = TRANSMIT_WRITE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - spi_write_8bit_array(WIFI_SPI_INDEX, buff, length); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_spi_send_done(); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_data_multi(wifi_spi_send_multi_struct *multi_buffer) -{ - uint8 i; - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - wifi_transmit_state = TRANSMIT_WRITE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - - for(i = 0; i < WIFI_SPI_MAX_MULTI; i++) - { - if(NULL != multi_buffer->source[i]) spi_write_8bit_array(WIFI_SPI_INDEX, multi_buffer->source[i], multi_buffer->length[i]); - } - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_spi_send_done(); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 接收模块发送的数据 -// 参数说明 *buff 接收数组的缓冲区首地址 -// 参数说明 length 需要接收的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_data(uint8 *buff, uint16 length) -{ - spi_read_8bit_array(WIFI_SPI_INDEX, buff, length); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送命令到模块 -// 参数说明 *str 命令字符串首地址 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_command(const char *str) -{ - uint8 state = 0; - uint16 send_length; - uint16 wait_time = 0; - - // 请求发送数据 - send_length = (uint16)strlen(str); - - // 等待传输进入空闲 - while(TRANSMIT_IDLE != wifi_transmit_state); - - // 如果没有进入发送状态则重新请求发送数据 - while(BUFFER_WRITE != wifi_buffer_state) - { - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - while(!wifi_spi_ack_flag) - { - wait_time++; - if((WAIT_TIME_OUT / 4) <= wait_time) - { - state = 1; - wifi_spi_init_flag = 0; // 模块已断开 - break; - } - system_delay_ms(1); - } - - if(1 == state) + system_delay_us(10); + time++; + if(wait_time <= time) { break; } } - - wifi_buffer_state = BUFFER_IDLE; - - if(0 == state) // 通讯未超时 - { - wifi_spi_send_remain_length = send_length; - // 发送消息 - wifi_spi_send_data((const uint8 *)str, send_length); - } + return (wait_time <= time); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 检查模块状态并读取模块发送的数据 -// 参数说明 void -// @return void -// Sample usage: +// 函数简介 写入数据到WIFI SPI +// 参数说明 *buffer1 第一组需要发送的数据缓冲区地址 +// 参数说明 length1 第一组数据长度 +// 参数说明 *buffer2 第二组需要发送的数据缓冲区地址 +// 参数说明 length2 第二组数据长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -void wifi_spi_check_state_read_buffer(void) +static void wifi_spi_write (const uint8 *buffer1, uint16 length1, const uint8 *buffer2, uint16 length2) { - uint16 wifi_spi_receive_length; // 本次接收到的数据数量 - uint8 wifi_spi_receive_buffer[WIFI_SPI_WRITE_MAX]; - - // 查询WIFI模块的状态 - wifi_buffer_state = wifi_spi_read_state(&wifi_spi_receive_length); - - // 如果需要读取WIFI模块数据,则保存需要读取的长度 - if(BUFFER_READ == wifi_buffer_state) + gpio_low(WIFI_SPI_CS_PIN); + if(NULL != buffer1) { - wifi_spi_receive_start(); - do - { - if(wifi_spi_receive_length > WIFI_SPI_WRITE_MAX) - { - wifi_spi_receive_data((uint8 *)wifi_spi_receive_buffer, WIFI_SPI_WRITE_MAX); - fifo_write_buffer(&wifi_spi_fifo, wifi_spi_receive_buffer, WIFI_SPI_WRITE_MAX); // 存入 FIFO - wifi_spi_receive_length = wifi_spi_receive_length - WIFI_SPI_WRITE_MAX; - } - else - { - wifi_spi_receive_data((uint8 *)wifi_spi_receive_buffer, wifi_spi_receive_length); - fifo_write_buffer(&wifi_spi_fifo, wifi_spi_receive_buffer, wifi_spi_receive_length); // 存入 FIFO - wifi_spi_receive_length = 0; - } - }while(wifi_spi_receive_length > 0); - wifi_spi_receive_done(); + spi_write_8bit_array(WIFI_SPI_INDEX, buffer1, length1); } - else if(BUFFER_IDLE == wifi_buffer_state) + if(NULL != buffer2) { - // 如果模块内部缓冲区状态为空闲,则传输状态也设置为空闲 - wifi_transmit_state = TRANSMIT_IDLE; + spi_write_8bit_array(WIFI_SPI_INDEX, buffer2, length2); } + gpio_high(WIFI_SPI_CS_PIN); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块 -// 参数说明 *buff 需要发送的数据首地址 -// 参数说明 length 需要发送的长度 -// @return uint32 剩余未发送长度 -// Sample usage: +// 函数简介 WIFI SPI 发送与接收同时进行(命令收发) +// 参数说明 *packets 发送与接收的地址 +// 参数说明 length 需要接收的长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_write_data(const uint8 *buff, uint32 length) +static void wifi_spi_transfer_command (wifi_spi_packets_struct *packets, uint16 length) { - uint16 send_length; - uint32 wait_time; + gpio_low(WIFI_SPI_CS_PIN); - // 记录需要发送的长度 - wifi_spi_send_remain_length = length; - - while(wifi_spi_send_remain_length) + spi_transfer_8bit(WIFI_SPI_INDEX, (uint8 *)&(packets->head), (uint8 *)&(packets->head), sizeof(wifi_spi_head_struct)); + + if(length) { - send_length = (uint16)func_limit_ab(wifi_spi_send_remain_length, 1, WIFI_SPI_WRITE_MAX); - - // 请求发送数据 - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - - // 最长等待5秒 - wait_time = 5000; - while(!wifi_spi_ack_flag) - { - wait_time--; - if(0 == wait_time) break; - system_delay_ms(1); - } - - if(BUFFER_WRITE == wifi_buffer_state) - { - // 发送消息 - wifi_spi_send_data(buff, send_length); - buff += send_length; - wifi_spi_send_remain_length -= send_length; - wifi_buffer_state = BUFFER_IDLE; - } - else - { - break; - } + spi_transfer_8bit(WIFI_SPI_INDEX, (const uint8 *)(packets->buffer), packets->buffer, length); } - - return wifi_spi_send_remain_length; + + gpio_high(WIFI_SPI_CS_PIN); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// @return uint32 剩余未发送长度 -// Sample usage: 发送数据总长度不能超过4092个 +// 函数简介 WIFI SPI 发送与接收同时进行(数据收发) +// 参数说明 *write_data 发送的数据缓冲区地址 +// 参数说明 *read_data 接收到的数据的存储地址 +// 参数说明 length 需要接收的长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_write_data_multi(wifi_spi_send_multi_struct *multi_buffer) +static void wifi_spi_transfer_data (const uint8 *write_data, wifi_spi_packets_struct *read_data, uint16 length) { - uint16 send_length; - uint32 wait_time; + gpio_low(WIFI_SPI_CS_PIN); - // 记录需要发送的长度 - send_length = multi_buffer->length[0] + multi_buffer->length[1] + multi_buffer->length[2] + multi_buffer->length[3] + multi_buffer->length[4] + multi_buffer->length[5] + multi_buffer->length[6] + multi_buffer->length[7]; + read_data->head.command = WIFI_SPI_DATA; + read_data->head.length = length; - if(WIFI_SPI_WRITE_MAX >= send_length) + spi_transfer_8bit(WIFI_SPI_INDEX, (uint8 *)&(read_data->head), (uint8 *)&(read_data->head), sizeof(wifi_spi_head_struct)); + + if(WIFI_SPI_RECVIVE_SIZE < length) { - // 请求发送数据 - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - - // 最长等待5秒 - wait_time = 5000; - while(!wifi_spi_ack_flag) - { - wait_time--; - if(0 == wait_time) break; - system_delay_ms(1); - } - - if(BUFFER_WRITE == wifi_buffer_state) - { - // 发送消息 - wifi_spi_send_data_multi(multi_buffer); - send_length = 0; - wifi_buffer_state = BUFFER_IDLE; - } + spi_transfer_8bit(WIFI_SPI_INDEX, write_data, read_data->buffer, WIFI_SPI_RECVIVE_SIZE); + spi_write_8bit_array(WIFI_SPI_INDEX, &write_data[WIFI_SPI_RECVIVE_SIZE], length - WIFI_SPI_RECVIVE_SIZE); } - - return send_length; + else + { + // 将需要发送的数据拷贝到读取缓冲区,避免出现write_data越界访问 + memcpy(read_data->buffer, write_data, length); + spi_transfer_8bit(WIFI_SPI_INDEX, read_data->buffer, read_data->buffer, WIFI_SPI_RECVIVE_SIZE); + } + gpio_high(WIFI_SPI_CS_PIN); } -//-------------------------------------------------------------------------------------------------- -// 函数简介 等待模块响应 -// 参数说明 *wait_buffer 等待的响应的字符串 -// 参数说明 timeout 超时时间 -// 返回参数 uint8 0:模块响应指定数据 1:模块未响应指定数据或超时 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_wait_ack (char *wait_buffer, uint32 timeout) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 参数设置 +// 参数说明 command 命令类型 +// 参数说明 *buffer 参数地址 +// 参数说明 length 参数长度 +// 参数说明 wait_time 最大等待时间 单位100微妙 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_set_parameter (wifi_spi_packets_command_enum command, uint8 *buffer, uint16 length, uint32 wait_time) { - uint8 return_state = 1; - char receiver_buffer[8] = {0, 0, 0, 0, 0, 0, 0, 0}; - uint32 receiver_len = 8; - + uint8 return_state; + wifi_spi_head_struct head; + return_state = 1; do { - system_delay_ms(1); - // 判断接收缓冲区内是否有需要响应的指定数据 如果有 则跳出循环并且返回0 - receiver_len = 8; - fifo_read_tail_buffer(&wifi_spi_fifo, (uint8 *)receiver_buffer, &receiver_len, FIFO_READ_ONLY); + head.command = command; + head.length = length; + + // 等待从机准备就绪 + if(wifi_spi_wait_idle(wait_time)) + { + break; + } - if(strstr(receiver_buffer, wait_buffer)) + wifi_spi_write(&head.command, sizeof(wifi_spi_head_struct), buffer, length); + if(wifi_spi_wait_idle(wait_time)) + { + break; + } + // 接收应答信号 + + head.command = WIFI_SPI_DATA; + head.length = 0; + wifi_spi_transfer_command((wifi_spi_packets_struct *)&head, head.length); + system_delay_us(20); + if(WIFI_SPI_REPLY_OK == head.command) { return_state = 0; - break; } - else if(strstr(receiver_buffer, "ERROR") || strstr(receiver_buffer, "busy")) - { - // 如果接收到报错或者模块忙 则跳出循环并且返回1 - return_state = 1; - break; - } - }while(timeout --); + }while(0); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 清除WiFi接收缓冲区内容 -// 参数说明 void -// 返回参数 void -// 使用示例 wifi_spi_clear_receive_buffer(); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static void wifi_spi_clear_receive_buffer (void) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 模块信息获取 +// 参数说明 command 命令类型 +// 参数说明 *buffer 保存接收到的参数地址 +// 参数说明 wait_time 最大等待时间 单位100微妙 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_parameter (wifi_spi_packets_command_enum command, wifi_spi_packets_struct *read_data, uint32 wait_time) { - // 清空WiFi接收缓冲区 - fifo_clear(&wifi_spi_fifo); -} + uint8 return_state; -//-------------------------------------------------------------------------------------------------- -// 函数简介 模块数据解析 -// 参数说明 *target_buffer 目标存放地址指针 字符串数组 -// 参数说明 *origin_buffer 数据来源地址指针 字符串数组 -// 参数说明 start_char 起始提取字节 例如从 "1234" 中从 '2' 开始提取 就应该填入 '2' -// 参数说明 end_char 结束提取字节 例如从 "1234" 中在 '4' 结束提取 就应该填入 '\0'(0x00 空字符 一般是字符串结尾) -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_data_parse(wifi_spi_information.mac, wifi_spi_receive_buffer, '"', '"'); // 调用获取本机mac地址后,调用此函数提取mac地址 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char start_char, char end_char) -{ - uint8 return_state = 0; - char *location1; - char *location2; - location1 = strchr((char *)origin_buffer, start_char); - if(location1) + return_state = 1; + do { - location1 ++; - location2 = strchr(location1, end_char); - if(location2) + // 等待从机准备就绪 + if(wifi_spi_wait_idle(wait_time)) { - memcpy(target_buffer, location1, location2-location1); + break; } - else + read_data->head.command = command; + wifi_spi_write(&(read_data->head.command), WIFI_SPI_RECVIVE_SIZE, NULL, 0); + + if(wifi_spi_wait_idle(wait_time)) { - return_state = 1; + break; } - } - else - { - return_state = 1; - } + read_data->head.command = WIFI_SPI_DATA; + read_data->head.length = 0; + wifi_spi_transfer_command(read_data, WIFI_SPI_RECVIVE_SIZE); + return_state = 0; + }while(0); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 查看模块版本信息 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_get_version(); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 固件版本获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,固件版本信息以字符串形式保存在wifi_spi_version数组中 +//------------------------------------------------------------------------------------------------------------------- static uint8 wifi_spi_get_version (void) { - char *location1; - uint8 return_state = 0; - uint8 receiver_buffer[256]; - uint32 receiver_len = 256; + uint8 return_state; + wifi_spi_packets_struct temp_packets; - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+GMR\r\n"); - do + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_VERSION, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_VERSION == temp_packets.head.command)) { - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - location1 = strrchr((char *)receiver_buffer, ':'); - if(wifi_spi_data_parse(wifi_spi_information.version, (uint8 *)location1, ':', '(')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - + memcpy(wifi_spi_version, temp_packets.buffer, temp_packets.head.length); + } return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 模块回显设置 -// 参数说明 model 0:关闭模块的回写功能 其他:开启模块回写 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_echo_set("1");//开启模块回写功能 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_echo_set (char *model) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI MAC地址获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,MAC地址信息以字符串形式保存在wifi_spi_mac_addr数组中 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_mac_addr (void) { - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - if('1' == *model) + uint8 return_state; + wifi_spi_packets_struct temp_packets; + + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_MAC_ADDR, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_MAC_ADDR == temp_packets.head.command)) { - wifi_spi_send_command("ATE1\r\n"); + memcpy(wifi_spi_mac_addr, temp_packets.buffer, temp_packets.head.length); + } + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI IP地址与端口号获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 +// 需要在连接Socket之后调用此函数才能正常获取信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_ip_addr_port (void) +{ + uint8 return_state; + wifi_spi_packets_struct temp_packets; + + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_IP_ADDR, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_IP_ADDR == temp_packets.head.command)) + { + memcpy(wifi_spi_ip_addr_port, temp_packets.buffer, temp_packets.head.length); + } + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 设置连接的WiFi信息并尝试连接WiFi +// 参数说明 *wifi_ssid WIFI名称 +// 参数说明 *pass_word WIFI密码 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_wifi_connect("SEEKFREE", "SEEKFREE123"); +// 备注信息 wifi_spi_wifi_connect("SEEKFREE", NULL); // 连接没有密码的WIFI热点 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_wifi_connect (char *wifi_ssid, char *pass_word) +{ + uint8 return_state; + uint8 temp_buffer[64]; + uint16 length; + + if(NULL != pass_word) + { + // WIFI热点有密码发送热点名称与密码 + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n%s\r\n", wifi_ssid, pass_word); } else { - wifi_spi_send_command("ATE0\r\n"); + // WIFI热点没有密码只需要发送热点名称 + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n", wifi_ssid); } - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + return_state = wifi_spi_set_parameter(WIFI_SPI_SET_WIFI_INFORMATION, temp_buffer, length, WIFI_CONNECT_TIME_OUT); + + // 本机IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 + wifi_spi_get_ip_addr_port(); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块自身 的 MAC 地址 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_mac()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_mac (void) -{ - uint8 return_state = 0; - uint8 receiver_buffer[64]; - uint32 receiver_len = 64; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPAPMAC?\r\n"); - do - { - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - if(wifi_spi_data_parse(wifi_spi_information.mac, receiver_buffer, '"', '"')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块或者目标WIFI 的 IP 地址(取决于模块当前的工作模式) -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_ip()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_ip (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_STATION == wifi_spi_information.mode) - { - wifi_spi_send_command("AT+CIPSTA?\r\n"); - } - else if(WIFI_SPI_SOFTAP == wifi_spi_information.mode) - { - wifi_spi_send_command("AT+CIPAP?\r\n"); - } - - do - { - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - uint8 receiver_buffer[128]; - uint32 receiver_len = 128; - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - if(wifi_spi_data_parse(wifi_spi_information.local_ip, receiver_buffer, '"', '"')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块的相关信息 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_information()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_information (void) -{ - uint8 return_state = 0; - do - { - // 获取模块版本号 - if(wifi_spi_get_version()) - { - return_state = 1; - break; - } - // 获取模块IP地址 - if(wifi_spi_get_ip()) - { - return_state = 1; - break; - } - // 获取模块MAC信息 - if(wifi_spi_get_mac()) - { - return_state = 1; - break; - } - memcpy(wifi_spi_information.local_port, "no port", 7); - }while(0); - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 连接 WiFi -// 参数说明 wifi_ssid WiFi名称 -// 参数说明 pass_word WiFi密码 -// 参数说明 model 0:查询WiFi连接情况 其他:连接WiFi -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_get_or_connect_wifi("WiFi_name", "Pass_word", 1); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_wifi (char *wifi_ssid, char *pass_word) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SOFTAP == wifi_spi_information.mode) - { - sprintf(temp, "AT+CWSAP=\"%s\",\"%s\",5,3\r\n", wifi_ssid, pass_word); - wifi_spi_send_command(temp); - } - else - { - sprintf(temp, "AT+CWJAP=\"%s\",\"%s\"\r\n", wifi_ssid, pass_word); - wifi_spi_send_command(temp); - } - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 上电是否自动连接WiFi -// 参数说明 model 0:上电不自动连接wifi 其他:上电自动连接wifi -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_auto_connect_wifi(0); //上电不自动连接wifi -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_auto_connect_wifi (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CWAUTOCONN=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置连接模式 -// 参数说明 model 0: 单连接模式 1:多连接模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_connect_model("1"); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_connect_model (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPMUX=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置传输模式 -// 参数说明 model – 0: 普通传输模式 IP断开后不重新连接 -// – 1: Wi-Fi 透传接收模式,仅支持 TCP 单连接、UDP 固定通信对端、SSL 单连接的情况 IP断开后会不断尝试重新连接 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_transfer_model("1"); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_transfer_model (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPMODE=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置模块模式 (Station/SoftAP/Station+SoftAP) -// 参数说明 state 0:无 Wi-Fi 模式,并且关闭 Wi-Fi RF----1: Station 模式----2: SoftAP 模式----3: SoftAP+Station 模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_model("1"); +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 设置连接的Socket信息并尝试连接Socket +// 参数说明 *transport_type 传输类型 +// 参数说明 *ip_addr IP地址 +// 参数说明 *port 目标端口号 +// 参数说明 *local_port 本机端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_socket_connect("TCP", "192.168.2.5", "8080", "6060"); // 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_set_model (wifi_spi_mode_enum mode) +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_socket_connect (char *transport_type, char *ip_addr, char *port, char *local_port) { - uint8 return_state = 0; + uint8 return_state; + uint8 temp_buffer[41]; + uint16 length; + + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n%s\r\n%s\r\n%s\r\n", transport_type, ip_addr, port, local_port); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + return_state = wifi_spi_set_parameter(WIFI_SPI_SET_SOCKET_INFORMATION, temp_buffer, length, SOCKET_CONNECT_TIME_OUT); - if(WIFI_SPI_SOFTAP == mode) - { - wifi_spi_send_command("AT+CWMODE=2\r\n"); - } - else - { - wifi_spi_send_command("AT+CWMODE=1\r\n"); - } - // 设置模块工作模式 - wifi_spi_information.mode = mode; - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + // 本机IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 + wifi_spi_get_ip_addr_port(); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 关闭睡眠模式 -// 参数说明 mode -// 返回参数 uint8 0:成功 1:失败 +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 断开Socket连接 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_socket_disconnect(); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_socket_disconnect (void) +{ + wifi_spi_packets_struct temp_packets; + + return wifi_spi_get_parameter(WIFI_SPI_CLOSE_SOCKET, &temp_packets, OTHER_TIME_OUT); +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 软复位 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 // 使用示例 // 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_close_sleep_model (void) +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_reset (void) { - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+SLEEP=0\r\n"); - // 设置模块工作模式 - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 断开与wifi的连接 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_disconnected_wifi(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_disconnected_wifi (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CWQAP\r\n"); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 进入打开透传模式 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_entry_serianet(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_entry_serianet (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPSEND\r\n"); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 退出透传模式 -// 参数说明 model 0:关闭透传模式 其他:开启透传模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_exit_serianet(1); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_exit_serianet (void) -{ - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - system_delay_ms(20); - wifi_spi_send_command("+++"); - system_delay_ms(1000); - - return 0; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 建立TCP连接 -// 参数说明 ip 远端 IPv4 地址、IPv6 地址,或域名 -// 参数说明 port 远端端口值 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_connect_tcp_servers("192.168.101.110", "8080"); -// 备注信息 如果总是连接不上电脑的TCP服务器 可以尝试使用网线连接电脑 -// 如果是使用WiFi连接 可能会导致模块连接TCP服务器等待较长时间 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_connect_tcp_servers (char *ip, char *port, wifi_spi_transfer_mode_enum mode) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + uint8 return_state; + wifi_spi_head_struct head; + return_state = 1; do { - if(wifi_spi_set_connect_model("0")) + head.command = WIFI_SPI_RESET; + head.length = 0xA5A5; + return_state = wifi_spi_wait_idle(OTHER_TIME_OUT); + if(return_state) { - return_state = 1; break; } + wifi_spi_write(&head.command, sizeof(wifi_spi_head_struct), NULL, 0); + }while(0); + + return return_state; +} - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPSTARTEX=\"TCP\",\"%s\",%s\r\n", ip, port); - wifi_spi_send_command(temp); - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI UDP模式时立即发送函数 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 在UDP模式下模块收到数据后会等待2毫秒,2毫秒后未收到数据则将数据通过socket发送到网络,如果希望立即发送则在数据传输完毕后调用此函数 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_udp_send_now (void) +{ + uint8 return_state = 1; + wifi_spi_packets_struct temp_packets; + + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + do { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - // 设置传输模式 - if(wifi_spi_set_transfer_model(WIFI_SPI_COMMAND == mode ? "0" : "1")) - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPSTATE?\r\n"); - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - else - { - uint8 receiver_buffer[128]; - uint32 receiver_len = 128; - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - char* buffer_index = (char *)receiver_buffer; - char* end_index; - - buffer_index += 22; - buffer_index += strlen(ip); - buffer_index += strlen(port); - end_index = strchr(buffer_index, ','); - - memcpy(wifi_spi_information.local_port, " ", 7); - memcpy(wifi_spi_information.local_port, buffer_index, (end_index - buffer_index)); - } - - wifi_spi_information.connect_state = WIFI_SPI_SERVER_ON; - wifi_spi_information.connect_mode = WIFI_SPI_TCP_CLIENT; - wifi_spi_information.transfer_mode = mode; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SERIANET == mode) // 透传模式下直接开启透传 - { - if(wifi_spi_entry_serianet()) + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) { - return_state = 1; break; } - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 建立UDP连接 -// 参数说明 *ip 远端 IPv4 地址、IPv6 地址 或域名 字符串形式 -// 参数说明 *port 远端端口值 字符串形式 -// 参数说明 *local_port 远端 IPv4 地址、IPv6 地址 或域名 字符串形式 -// 参数说明 mode 模块数据通信模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_connect_udp_client("192.168.101.110", "8080", "8080", WIFI_SPI_COMMAND); -// 备注信息 自动分配ID -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_connect_udp_client (char *ip, char *port, char *local_port, wifi_spi_transfer_mode_enum mode) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - do - { - if(wifi_spi_set_connect_model("0")) - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + // 立即开始socket发送 + temp_packets.head.command = WIFI_SPI_UDP_SEND; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + + // 等待应答信号 + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + + // 接收应答信号 + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, temp_packets.head.length); + + if(WIFI_SPI_REPLY_OK == temp_packets.head.command) + { + return_state = 0; + } + + }while(0); - sprintf(temp, "AT+CIPSTARTEX=\"UDP\",\"%s\",%s,%s\r\n", ip, port, local_port); - wifi_spi_send_command(temp); + // 将通讯状态设置为空闲 + wifi_spi_mutex = WIFI_SPI_IDLE; + } + + return return_state; +} - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 数据块发送函数并同步接收数据 +// 参数说明 *buff 需要发送的数据地址 +// 参数说明 length 发送长度 +// 返回参数 uint32 剩余未发送的长度 +// 使用示例 wifi_spi_send_buffer(buffer, 100); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +uint32 wifi_spi_send_buffer (const uint8 *buffer, uint32 length) +{ + uint16 send_length; + wifi_spi_packets_struct temp_packets; + + // 检查WIFI SPI状态,如果在其他中断或者线程中已经发起了通讯,则本次不能发送数据 + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + + while(length) { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_spi_set_transfer_model(WIFI_SPI_COMMAND == mode ? "0" : "1")) // 设置传输模式 - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SERIANET == mode) // 透传模式下直接开启透传 - { - if(wifi_spi_entry_serianet()) + send_length = length > WIFI_SPI_TRANSFER_SIZE ? (uint16)WIFI_SPI_TRANSFER_SIZE : (uint16)length; + + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) { - return_state = 1; break; } - } - memcpy(wifi_spi_information.local_port, " ", 7); - memcpy(wifi_spi_information.local_port, local_port, strlen(local_port)); - wifi_spi_information.connect_state = WIFI_SPI_SERVER_ON; - wifi_spi_information.connect_mode = WIFI_SPI_UDP_CLIENT; - wifi_spi_information.transfer_mode = mode; - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 断开连接 TCP Server 使用本接口将会断开所有连接 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_disconnect_link(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_disconnect_link (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - do - { - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - wifi_spi_send_command("AT+CIPCLOSE=5\r\n"); - } - else - { - wifi_spi_send_command("AT+CIPCLOSE\r\n"); - } - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送字节函数 -// 参数说明 data 需要发送的数据 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_byte(0xa5); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_byte (uint8 data) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - send_length = 1; - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data(&data, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else - { - send_length = (uint16)wifi_spi_write_data(&data, send_length); - } - } - } - - return send_length; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送缓冲区函数 -// 参数说明 buff 需要发送的数据地址 -// 参数说明 len 发送长度 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_buffer("123", 3); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 len) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - while(len) - { - if((WIFI_SPI_WRITE_MAX * 2) < len) send_length = WIFI_SPI_WRITE_MAX * 2; - else - { - send_length = (uint16)len; - } - len -= send_length; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data(buff, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } - buff += send_length; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else - { - len = wifi_spi_write_data(buff, len); - } - } - } - - return len; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送缓冲区函数(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 -// 备注信息 需要发送多个数组时,采用此函数可以极大的降低通讯时间,发送数据总长度不能超过4092 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_buffer_multi (wifi_spi_send_multi_struct *multi_buffer) -{ - uint8 i; - uint16 remain_length; - - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - for(i = 0; i < WIFI_SPI_MAX_MULTI; i++) - { - if(multi_buffer->source[i]) wifi_spi_send_buffer(multi_buffer->source[i], multi_buffer->length[i]); - } - } - else - { - remain_length = (uint16)wifi_spi_write_data_multi(multi_buffer); - } - } - } - - return remain_length; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送字符串函数 -// 参数说明 *str 需要发送的数据 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_string("123"); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_string (const char *str) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - send_length = (uint16)strlen(str); - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data((uint8 *)str, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } + wifi_spi_transfer_data(buffer, &temp_packets, send_length); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) { - send_length = (uint16)wifi_spi_write_data((uint8 *)str, send_length); + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + + length -= send_length; + buffer += send_length; + } + + // 检查最后一次的接收是否将所有的数据都接收完毕 + while(WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) + { + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + + // 继续读取模块剩余数据 + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } } } + wifi_spi_mutex = WIFI_SPI_IDLE; } - - return send_length; + return length; } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi 模块数据接收函数 -// 参数说明 buffer 接收数据的存放地址 -// 参数说明 len 数组长度,可直接填写或者使用sizeof求得 -// 返回参数 uint32 返回实际接收到的数据长度 -// 使用示例 uint8 test_buffer[256]; wifi_spi_read_buffer(&test_buffer[0], sizeof(test_buffer)); +// 函数简介 WIFI SPI 读取缓冲区 +// 参数说明 *buff 接收缓冲区 +// 参数说明 length 读取数据长度 +// 返回参数 uint32 实际读取数据长度 +// 使用示例 wifi_spi_read_buffer(buffer, 100); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 len) +uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 length) { - fifo_read_buffer(&wifi_spi_fifo, buffer, &len, FIFO_READ_AND_CLEAN); - return len; + zf_assert(NULL != buffer); + uint32 data_len = length; + +#if(1 == WIFI_SPI_READ_TRANSFER) + + wifi_spi_packets_struct temp_packets; + // 检查WIFI SPI状态,如果在其他中断或者线程中已经发起了通讯,则本次不能发送数据 + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + + // 发起通讯查看模块内是否有数据未读取 + do + { + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + }while(WIFI_SPI_REPLY_DATA_START == temp_packets.head.command); + wifi_spi_mutex = WIFI_SPI_IDLE; + } +#endif + + fifo_read_buffer(&wifi_spi_fifo, buffer, &data_len, FIFO_READ_AND_CLEAN); + return data_len; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 wifi spi handshake中断回调函数 -// 参数说明 void -// 返回参数 void -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -void wifi_spi_callback (void) -{ - wifi_spi_check_state_read_buffer(); - wifi_spi_ack_flag = 1; // ACK标志位置1 -} - - //------------------------------------------------------------------------------------------------------------------- // 函数简介 WiFi 模块初始化 // 参数说明 *wifi_ssid 目标连接的 WiFi 的名称 字符串形式 // 参数说明 *pass_word 目标连接的 WiFi 的密码 字符串形式 -// 参数说明 wifi_mode 模块的工作模式 参照 zf_device_wireless_spi.h 中 wifi_spi_mode_enum 枚举 // 返回参数 uint8 模块初始化状态 0-成功 1-错误 -// 使用示例 wifi_spi_init("SEEKFREE_2.4G", "SEEKFREEV2", WIFI_UART_STATION); -// 备注信息 初始化会首先设置串口配置,之后会对模块进行基本参数配置 -// 具体的配置信息可以在 zf_device_wireless_spi.h 文件中修改 +// 使用示例 wifi_spi_init("SEEKFREE", "SEEKFREE123"); +// 备注信息 wifi_spi_init("SEEKFREE", NULL); // 连接没有密码的WIFI热点 //------------------------------------------------------------------------------------------------------------------- -uint8 wifi_spi_init (char *wifi_ssid, char *pass_word, wifi_spi_mode_enum wifi_mode) +uint8 wifi_spi_init (char *wifi_ssid, char *pass_word) { uint8 return_state = 0; - uint32 temp_isr; - - spi_init(WIFI_SPI_INDEX, SPI_MODE0, WIFI_SPI_SPEED, WIFI_SPI_SCK_PIN, WIFI_SPI_MOSI_PIN, WIFI_SPI_MISO_PIN, SPI_CS_NULL);//硬件SPI初始化 - set_wireless_type(WIFI_SPI, wifi_spi_callback); - fifo_init(&wifi_spi_fifo, FIFO_DATA_8BIT, wifi_spi_buffer, WIFI_SPI_BUFFER_SIZE); + fifo_init(&wifi_spi_fifo, FIFO_DATA_8BIT, wifi_spi_buffer, WIFI_SPI_RECVIVE_FIFO_SIZE); + spi_init(WIFI_SPI_INDEX, SPI_MODE3, WIFI_SPI_SPEED, WIFI_SPI_SCK_PIN, WIFI_SPI_MOSI_PIN, WIFI_SPI_MISO_PIN, SPI_CS_NULL);//硬件SPI初始化 gpio_init(WIFI_SPI_CS_PIN, GPO, 1, GPO_PUSH_PULL); gpio_init(WIFI_SPI_RST_PIN, GPO, 1, GPO_PUSH_PULL); - - temp_isr = interrupt_global_disable(); - - exti_init(WIFI_SPI_INT_PIN, EXTI_TRIGGER_RISING); - + gpio_init(WIFI_SPI_INT_PIN, GPI, 0, GPI_PULL_DOWN); + + // 复位 gpio_set_level(WIFI_SPI_RST_PIN, 0); - system_delay_ms(50); + system_delay_ms(10); gpio_set_level(WIFI_SPI_RST_PIN, 1); - system_delay_ms(1000); + + // 等待模块初始化 + system_delay_ms(100); + wifi_spi_mutex = WIFI_SPI_IDLE; - exti_flag_clear(WIFI_SPI_INT_PIN); - - interrupt_global_enable(temp_isr); do { - if(wifi_spi_echo_set("0")) // 关闭模块回写 + // 固件版本信息以字符串形式保存在wifi_spi_version数组中 + return_state = wifi_spi_get_version(); + if(return_state) + { + break; + } + + // MAC地址信息以字符串形式保存在wifi_spi_mac_addr数组中 + wifi_spi_get_mac_addr(); + + + return_state = wifi_spi_wifi_connect(wifi_ssid, pass_word); + if(return_state) { - zf_log(0, "exit echo failed"); - return_state = 1; break; } - if(wifi_spi_auto_connect_wifi("0")) // 关闭自动连接 + #if(1 == WIFI_SPI_AUTO_CONNECT) + return_state = wifi_spi_socket_connect("TCP", WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT); + if(return_state) { - zf_log(0, "close auto connect failed"); - return_state = 1; break; } - - if(wifi_spi_set_model(wifi_mode)) // 设置运行模式 + #endif + + #if(2 == WIFI_SPI_AUTO_CONNECT) + return_state = wifi_spi_socket_connect("UDP", WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT); + if(return_state) { - zf_log(0, "set run mode failed"); - return_state = 1; break; } - - if(wifi_spi_close_sleep_model()) // 关闭睡眠模式 - { - zf_log(0, "set sleep mode failed"); - return_state = 1; - break; - } - - if(wifi_spi_set_wifi((char *)wifi_ssid, (char *)pass_word)) // 连接 wifi 或者开启热点 - { - zf_log(0, "wifi set failed"); - return_state = 1; - break; - } - - if(wifi_spi_get_information()) // 模块基本参数获取 - { - zf_log(0, "get module information failed"); - return_state = 1; - break; - } -#if WIFI_SPI_AUTO_CONNECT == 1 - if(wifi_spi_connect_tcp_servers(WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_SERIANET)) // 连接TCP服务器 - { - zf_log(0, "connect TCP server failed"); - return_state = 1; - break; - } -#endif -#if WIFI_SPI_AUTO_CONNECT == 2 - if(wifi_spi_connect_udp_client(WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT, WIFI_SPI_SERIANET)) // 建立UDP连接 - { - zf_log(0, "connect UDP server failed"); - return_state = 1; - break; - } -#endif - // 模块初始化成功 - wifi_spi_init_flag = 1; + #endif }while(0); - + return return_state; } diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_wifi_spi.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_wifi_spi.h index 5e5a025..24e7eb1 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_wifi_spi.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_wifi_spi.h @@ -24,13 +24,13 @@ * 文件名称 zf_device_wifi_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 * 日期 作者 备注 -* 2023-05-27 pudding first version +* 2024-01-18 SeekFree first version ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,128 +53,100 @@ #include "zf_common_typedef.h" + #define WIFI_SPI_INDEX (SPI_3 ) // 定义使用的SPI号 -#define WIFI_SPI_SPEED (30 * 1000 * 1000 ) // 硬件 SPI 速率 +#define WIFI_SPI_SPEED (50 * 1000 * 1000 ) // 硬件 SPI 速率 #define WIFI_SPI_SCK_PIN (SPI3_SCLK_P22_3 ) // 定义SPI_SCK引脚 #define WIFI_SPI_MOSI_PIN (SPI3_MOSI_P22_0 ) // 定义SPI_MOSI引脚 #define WIFI_SPI_MISO_PIN (SPI3_MISO_P22_1 ) // 定义SPI_MISO引脚 IPS没有MISO引脚,但是这里任然需要定义,在spi的初始化时需要使用 #define WIFI_SPI_CS_PIN (P22_2 ) // 定义SPI_CS引脚 采用软件CS引脚 -#define WIFI_SPI_INT_PIN (ERU_CH5_REQ1_P15_8) // 定义中断引脚 +#define WIFI_SPI_INT_PIN (P15_8 ) // 定义握手引脚 #define WIFI_SPI_RST_PIN (P23_1 ) // 定义复位引脚 - - -#define WIFI_SPI_BUFFER_SIZE (1024) // 定义SPI接收的缓冲区大小 -#define WIFI_SPI_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不连接 1-自动连接TCP服务器并进入透传模式 2-自动连接UDP服务器并进入透传模式 3:自动建立TCP服务器 - -#if (WIFI_SPI_AUTO_CONNECT > 2) + +#define WIFI_SPI_RECVIVE_FIFO_SIZE (1024) // 接收FIFO大小 +#define WIFI_SPI_READ_TRANSFER (1) // 在调用wifi_spi_read_buffer 是否尝试发起SPI通讯来检测模块内是否有数据需要读取 1:发起SPI通讯 0:不发起SPI通讯,仅读取FIFO + // 如果应用程序中没有任何的地方调用发送函数,则WIFI_SPI_READ_TRANSFER必须设置为1 + +#define WIFI_SPI_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不自动连接 1-自动连接TCP服务器 2-自动连接UDP + +#if (WIFI_SPI_AUTO_CONNECT > 2) #error "WIFI_SPI_AUTO_CONNECT 的值只能为 [0,1,2]" #else -#define WIFI_SPI_TARGET_IP "192.168.2.28" // 连接目标的 IP +#define WIFI_SPI_TARGET_IP "192.168.137.1" // 连接目标的 IP #define WIFI_SPI_TARGET_PORT "8080" // 连接目标的端口 -#define WIFI_SPI_LOCAL_PORT "8080" // 本机端口 +#define WIFI_SPI_LOCAL_PORT "6666" // 本机的端口 0:随机 可设置范围2048-65535 默认 6666 #endif -#define WIFI_SPI_MAX_MULTI (17) // 多地址发送,最大8个地址 -typedef enum -{ - BUFFER_IDLE, // 模块的缓冲区是空闲的 - BUFFER_READ, // 模块的缓冲区有数据需要读取 - BUFFER_WRITE, // 模块的缓冲区是可写的 -}wifi_spi_buffer_state_enum; +#define WIFI_SPI_RECVIVE_SIZE (32) // 每次SPI传输接收的字节数 不允许修改 +#define WIFI_SPI_TRANSFER_SIZE (4088) // 最大SPI传输接收的字节数 不允许修改 + + typedef enum -{ - TRANSMIT_IDLE, // 当前没有传输 - TRANSMIT_WRITE_REQUEST, // 给模块发送了一个传输请求 - TRANSMIT_READ_STATE, // 读取模块状态 - TRANSMIT_READ, // 正在读取模块内部数据 - TRANSMIT_WRITE, // 正在往模块写入数据 -}wifi_spi_transmit_state_enum; - -typedef enum -{ - WIFI_SPI_STATION, // 设备模式 - WIFI_SPI_SOFTAP, // AP模式 -}wifi_spi_mode_enum; - -typedef enum -{ - WIFI_SPI_COMMAND, // 使用命令的方式发送数据 - WIFI_SPI_SERIANET, // 使用透传的方式发送数据 -}wifi_spi_transfer_mode_enum; - -typedef enum -{ - WIFI_SPI_TCP_CLIENT, // 模块连接TCP服务器 - WIFI_SPI_TCP_SERVER, // 模块作为TCP服务器 - WIFI_SPI_UDP_CLIENT, // 模块启用UDP连接 -}wifi_spi_connect_mode_enum; - -typedef enum -{ - WIFI_SPI_SERVER_OFF, // 模块未连接服务器 - WIFI_SPI_SERVER_ON, // 模块已经连接服务器 -}wifi_spi_connect_state_enum; - -typedef enum -{ - WIFI_SPI_LINK_0, // 模块当前链接 0 - WIFI_SPI_LINK_1, // 模块当前链接 1 - WIFI_SPI_LINK_2, // 模块当前链接 2 - WIFI_SPI_LINK_3, // 模块当前链接 3 - WIFI_SPI_LINK_4, // 模块当前链接 4 -}wifi_spi_link_id_enum; - -typedef struct { - uint8 reserve; - uint8 cmd; - uint8 addr; - uint8 dummy; - uint8 magic; - uint8 sequence; - uint16 length; -}wifi_spi_buffer_struct; + // 主机发送的命令 + WIFI_SPI_INVALID1 = 0x00, // 无效数据包 + WIFI_SPI_RESET = 0x01, // 复位命令 + WIFI_SPI_DATA = 0x02, // 透传数据包 + WIFI_SPI_UDP_SEND = 0x03, // UDP下立即发送命令,默认SPI接收数据后2MS未收到数据自动发送数据 + WIFI_SPI_CLOSE_SOCKET = 0x04, // 断开连接 + + WIFI_SPI_SET_WIFI_INFORMATION = 0x10, // 设置WIFI信息命令 + WIFI_SPI_SET_SOCKET_INFORMATION = 0x11, // 设置SOCKET信息命令 + + WIFI_SPI_GET_VERSION = 0x20, // 获取模块版本 + WIFI_SPI_GET_MAC_ADDR = 0x21, // 获取模块MAC地址 + WIFI_SPI_GET_IP_ADDR = 0x22, // 获取模块IP地址 + + // 从机回传的命令 + WIFI_SPI_REPLY_OK = 0x80, // 从机应答的正确命令 + WIFI_SPI_REPLY_ERROR = 0x81, // 从机应答的错误命令 + + WIFI_SPI_REPLY_DATA_START = 0x90, // 从机回传的数据包,并且还有数据需要主机读取 + WIFI_SPI_REPLY_DATA_END = 0x91, // 从机回传的数据包,数据已读取完毕 + + WIFI_SPI_REPLY_VERSION = 0xA0, // 从机回复固件版本 + WIFI_SPI_REPLY_MAC_ADDR = 0xA1, // 从机回复本机MAC地址等信息 + WIFI_SPI_REPLY_IP_ADDR = 0xA2, // 从机回复本机IP地址、端口号 + WIFI_SPI_INVALID2 = 0xFF // 无效数据包 +}wifi_spi_packets_command_enum; + +typedef enum +{ + WIFI_SPI_IDLE, // 模块空闲,可以进行SPI通讯 + WIFI_SPI_BUSY, // 模块正忙,不可进行SPI通讯 +}wifi_spi_state_enum; + + +typedef struct +{ + uint8 command; // 命令字 + uint8 reserve; // 保留 + uint16 length; // 包有效长度 +}wifi_spi_head_struct; + + +typedef struct +{ + wifi_spi_head_struct head; // 帧头 + uint8 buffer[WIFI_SPI_RECVIVE_SIZE]; // 缓冲区 +}wifi_spi_packets_struct; + + +extern char wifi_spi_version[12]; // 固件版本 字符串 +extern char wifi_spi_mac_addr[20]; // 模块MAC地址 字符串 +extern char wifi_spi_ip_addr_port[25]; // IP地址与端口号 字符串 -typedef struct -{ - uint8 version[12]; // 固件版本 字符串形式 - uint8 mac[20]; // 本机 MAC 地址 字符串形式 - uint8 local_ip[17]; // 本机 IP 地址 字符串形式 - uint8 local_port[10]; // 本机端口号 字符串形式 - uint8 remote_ip[5][17]; // 远端 IP 地址 字符串形式 - wifi_spi_mode_enum mode; // WIFI 模式 - wifi_spi_transfer_mode_enum transfer_mode; // 当前传输模式 - wifi_spi_connect_mode_enum connect_mode; // 网络连接模式 - wifi_spi_connect_state_enum connect_state; // 服务器连接情况 -}wifi_spi_information_struct; +uint8 wifi_spi_wifi_connect (char *wifi_ssid, char *pass_word); +uint8 wifi_spi_socket_connect (char *transport_type, char *ip_addr, char *port, char *local_port); +uint8 wifi_spi_socket_disconnect (void); +uint8 wifi_spi_udp_send_now (void); +uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 length); +uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 length); -typedef struct -{ - uint8 *source[WIFI_SPI_MAX_MULTI]; - uint16 length[WIFI_SPI_MAX_MULTI]; -}wifi_spi_send_multi_struct; - -extern wifi_spi_information_struct wifi_spi_information; - - -uint8 wifi_spi_disconnected_wifi (void); // 断开 WIFI 连接 -uint8 wifi_spi_entry_serianet (void); // 打开透传模式 -uint8 wifi_spi_exit_serianet (void); // 关闭透传模式 - -uint8 wifi_spi_connect_tcp_servers (char *ip, char *port, wifi_spi_transfer_mode_enum mode); // 建立 TCP 连接 -uint8 wifi_spi_connect_udp_client (char *ip, char *port, char *local_port, wifi_spi_transfer_mode_enum mode); // 建立 UDP 传输 -uint8 wifi_spi_disconnect_link (void); // 断开连接 TCP Server 使用本接口将会断开所有连接 - -uint32 wifi_spi_send_byte (uint8 data); // WIFI 模块发送字节函数 -uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 length); // WIFI 模块发送缓冲区函数 -uint32 wifi_spi_send_buffer_multi (wifi_spi_send_multi_struct *multi_buffer); // WIFI 模块发送多缓冲区函数 -uint32 wifi_spi_send_string (const char *str); // WIFI 模块发送字符串函数 - -uint32 wifi_spi_read_buffer (uint8 *buff, uint32 len); // WIFI 模块数据接收函数 - -uint8 wifi_spi_init (char *wifi_ssid, char *pass_word, wifi_spi_mode_enum wifi_mode); // WIFI 模块初始化函数 +uint8 wifi_spi_init (char *wifi_ssid, char *pass_word); #endif + diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_wifi_uart.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_wifi_uart.c index 312dab7..ff728bb 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_wifi_uart.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_wifi_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_wifi_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -61,7 +61,7 @@ wifi_uart_information_struct wifi_uart_information; // 模块自身参数 -static fifo_obj_struct wifi_uart_fifo; +static fifo_struct wifi_uart_fifo; static uint8 wifi_uart_buffer[WIFI_UART_BUFFER_SIZE]; // 数据存放数组 static uint8 wifi_uart_data; diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_wifi_uart.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_wifi_uart.h index abcb253..3316b6f 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_wifi_uart.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_wifi_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_wifi_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_wireless_uart.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_wireless_uart.c index eac2867..91ec013 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_wireless_uart.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_wireless_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_wireless_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -53,7 +53,7 @@ #include "zf_device_type.h" #include "zf_device_wireless_uart.h" -static fifo_obj_struct wireless_uart_fifo; +static fifo_struct wireless_uart_fifo; static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; static uint8 wireless_uart_data = 0; diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_wireless_uart.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_wireless_uart.h index 2418545..a789ad0 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_wireless_uart.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_wireless_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_wireless_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -61,11 +61,11 @@ // 注意事项2:开启自动波特率务必连接RTS引脚 否则会开启失败。 // 注意事项3:模块自动波特率失败的话 可以尝试断电重启 -// 开启自动波特率务必阅读上面两条 注意事项 -// 开启自动波特率务必阅读上面两条 注意事项 -// 开启自动波特率务必阅读上面两条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 -// 0:关闭自动波特率 +// 0:关闭自动波特率 // 1:开启自动波特率 自动波特率的作用是修改 WIRELESS_UART_BAUD 之后不需要对模块进行配置 模块会自动设置为对应的波特率 #define WIRELESS_UART_AUTO_BAUD_RATE ( 1 ) diff --git a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_adc.c b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_adc.c index 9a262a1..06694d8 100644 --- a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_adc.c +++ b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_adc.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_adc * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_adc.h b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_adc.h index 378b67e..f017c76 100644 --- a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_adc.h +++ b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_adc.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_adc * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_delay.c b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_delay.c index 4ec533c..ae3e610 100644 --- a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_delay.c +++ b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_delay.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_delay * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_delay.h b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_delay.h index e8d82ef..7b8b475 100644 --- a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_delay.h +++ b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_delay.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_delay * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_dma.c b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_dma.c index f72f1d6..43bffbc 100644 --- a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_dma.c +++ b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_dma.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_dma * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_dma.h b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_dma.h index 1ec555b..320d40c 100644 --- a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_dma.h +++ b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_dma.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_dma * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_encoder.c b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_encoder.c index 6592198..0e0e0b9 100644 --- a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_encoder.c +++ b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_encoder.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_encoder.h b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_encoder.h index 68d159f..e079122 100644 --- a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_encoder.h +++ b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_encoder.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_exti.c b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_exti.c index 72c9a1f..31d270a 100644 --- a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_exti.c +++ b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_exti.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_exti * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_exti.h b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_exti.h index 30f5ef6..b63f9ee 100644 --- a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_exti.h +++ b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_exti.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_exti * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_flash.c b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_flash.c index f91f5a0..325cfed 100644 --- a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_flash.c +++ b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_flash.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_flash * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_flash.h b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_flash.h index 912585a..e7425fd 100644 --- a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_flash.h +++ b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_flash.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_flash * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_gpio.c b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_gpio.c index 5071114..a084353 100644 --- a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_gpio.c +++ b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_gpio.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_gpio * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_gpio.h b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_gpio.h index 2b23be0..550fb8d 100644 --- a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_gpio.h +++ b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_gpio.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_gpio * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_pit.c b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_pit.c index c4dc50d..5e03d38 100644 --- a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_pit.c +++ b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_pit.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pit * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_pit.h b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_pit.h index 5461e05..66854b5 100644 --- a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_pit.h +++ b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_pit.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pit * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_pwm.c b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_pwm.c index ad1059a..24d8d7a 100644 --- a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_pwm.c +++ b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_pwm.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pwm * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_pwm.h b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_pwm.h index d6dce78..51948a4 100644 --- a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_pwm.h +++ b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_pwm.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pwm * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_soft_iic.c b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_soft_iic.c index 9833b62..a349ec7 100644 --- a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_soft_iic.c +++ b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_soft_iic.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_iic * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_soft_iic.h b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_soft_iic.h index a62b262..80db53b 100644 --- a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_soft_iic.h +++ b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_soft_iic.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_iic * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_soft_spi.c b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_soft_spi.c index 292c60b..954fbe3 100644 --- a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_soft_spi.c +++ b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_soft_spi.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_soft_spi.h b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_soft_spi.h index 6a9c207..62858de 100644 --- a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_soft_spi.h +++ b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_soft_spi.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_spi.c b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_spi.c index 1b99196..f817dd9 100644 --- a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_spi.c +++ b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_spi.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -920,7 +920,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 do { - IfxQspi_writeTransmitFifo(moudle, (uint8)(*write_buffer & 0xFF00) >> 8); // 将发送的数据写入缓冲区 + IfxQspi_writeTransmitFifo(moudle, (uint8)((*write_buffer & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 if(read_buffer != NULL) { diff --git a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_spi.h b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_spi.h index e73507e..d15589c 100644 --- a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_spi.h +++ b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_spi.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_timer.c b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_timer.c index a953b92..e085d6e 100644 --- a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_timer.c +++ b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_timer.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_timer * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_timer.h b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_timer.h index 3c86f58..1bb348f 100644 --- a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_timer.h +++ b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_timer.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_timer * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_uart.c b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_uart.c index cd19782..fb89b55 100644 --- a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_uart.c +++ b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_uart.h b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_uart.h index 8d1d111..cdc55ab 100644 --- a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_uart.h +++ b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E04_pwm_demo/user/isr.c b/Example/E04_pwm_demo/user/isr.c index 27171d2..9108ff0 100644 --- a/Example/E04_pwm_demo/user/isr.c +++ b/Example/E04_pwm_demo/user/isr.c @@ -24,7 +24,7 @@ * 文件名称 isr * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -118,7 +118,7 @@ IFX_INTERRUPT(exti_ch1_ch5_isr, 0, EXTI_CH1_CH5_INT_PRIO) { exti_flag_clear(ERU_CH5_REQ1_P15_8); - wireless_module_spi_handler(); // SPI WIFI 中断回调函数 + } } diff --git a/Example/E05_pit_demo/libraries/doc/version.txt b/Example/E05_pit_demo/libraries/doc/version.txt index b841b50..d644136 100644 --- a/Example/E05_pit_demo/libraries/doc/version.txt +++ b/Example/E05_pit_demo/libraries/doc/version.txt @@ -1,3 +1,8 @@ +V3.2.6 + 更新逐飞助手接口函数 调用初始化时直接传参通信类 + 更新wifi SPI驱动文件 提高通信效率 + 更新GPS驱动文件,更名为GNSS,兼容普通定位模块及RTK + V3.2.5 修复延时函数初始化参数及中断向量表问题 V3.2.4 diff --git a/Example/E05_pit_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h b/Example/E05_pit_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h index 28ff689..371e6b6 100644 --- a/Example/E05_pit_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h +++ b/Example/E05_pit_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h @@ -34,7 +34,7 @@ /*------------------------------------------Configuration for IfxScu_cfg.h-------------------------------------------*/ /*********************************************************************************************************************/ /* External oscillator frequency in Hz */ -#define IFX_CFG_SCU_XTAL_FREQUENCY (20000000) /* Allowed values are: 16000000, 20000000 or 40000000 */ +#define IFX_CFG_SCU_XTAL_FREQUENCY (20000000) /* Allowed values are9p: 16000000, 20000000 or 40000000 */ /* PLL frequency in Hz */ #define IFX_CFG_SCU_PLL_FREQUENCY (200000000) /* Allowed values are: 80000000, 133000000, 160000000 * or 200000000 */ diff --git a/Example/E05_pit_demo/libraries/zf_common/zf_common_clock.c b/Example/E05_pit_demo/libraries/zf_common/zf_common_clock.c index 5023270..9872ea9 100644 --- a/Example/E05_pit_demo/libraries/zf_common/zf_common_clock.c +++ b/Example/E05_pit_demo/libraries/zf_common/zf_common_clock.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_clock * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_common/zf_common_clock.h b/Example/E05_pit_demo/libraries/zf_common/zf_common_clock.h index 9face65..2b50396 100644 --- a/Example/E05_pit_demo/libraries/zf_common/zf_common_clock.h +++ b/Example/E05_pit_demo/libraries/zf_common/zf_common_clock.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_clock * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_common/zf_common_debug.c b/Example/E05_pit_demo/libraries/zf_common/zf_common_debug.c index 52c623d..d680265 100644 --- a/Example/E05_pit_demo/libraries/zf_common/zf_common_debug.c +++ b/Example/E05_pit_demo/libraries/zf_common/zf_common_debug.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_debug * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -46,7 +46,7 @@ static volatile uint8 zf_debug_assert_enable = 1; #if DEBUG_UART_USE_INTERRUPT // 如果启用 debug uart 接收中断 uint8 debug_uart_buffer[DEBUG_RING_BUFFER_LEN]; // 数据存放数组 uint8 debug_uart_data; -fifo_obj_struct debug_uart_fifo; +fifo_struct debug_uart_fifo; #endif //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E05_pit_demo/libraries/zf_common/zf_common_debug.h b/Example/E05_pit_demo/libraries/zf_common/zf_common_debug.h index 881a297..4fb4d91 100644 --- a/Example/E05_pit_demo/libraries/zf_common/zf_common_debug.h +++ b/Example/E05_pit_demo/libraries/zf_common/zf_common_debug.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_debug * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_common/zf_common_fifo.c b/Example/E05_pit_demo/libraries/zf_common/zf_common_fifo.c index b010d3e..94f5133 100644 --- a/Example/E05_pit_demo/libraries/zf_common/zf_common_fifo.c +++ b/Example/E05_pit_demo/libraries/zf_common/zf_common_fifo.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_fifo * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -45,7 +45,7 @@ // 使用示例 fifo_head_offset(fifo, 1); // 备注信息 本函数在文件内部调用 用户不用关注 也不可修改 //------------------------------------------------------------------------------------------------------------------- -static void fifo_head_offset (fifo_obj_struct *fifo, uint32 offset) +static void fifo_head_offset (fifo_struct *fifo, uint32 offset) { fifo->head += offset; @@ -63,7 +63,7 @@ static void fifo_head_offset (fifo_obj_struct *fifo, uint32 offset) // 使用示例 fifo_end_offset(fifo, 1); // 备注信息 本函数在文件内部调用 用户不用关注 也不可修改 //------------------------------------------------------------------------------------------------------------------- -static void fifo_end_offset (fifo_obj_struct *fifo, uint32 offset) +static void fifo_end_offset (fifo_struct *fifo, uint32 offset) { fifo->end += offset; @@ -80,7 +80,7 @@ static void fifo_end_offset (fifo_obj_struct *fifo, uint32 offset) // 使用示例 fifo_clear(fifo); // 备注信息 清空当前 FIFO 对象的内存 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_clear (fifo_obj_struct *fifo) +fifo_state_enum fifo_clear (fifo_struct *fifo) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -113,7 +113,7 @@ fifo_state_enum fifo_clear (fifo_obj_struct *fifo) // 使用示例 uint32 len = fifo_used(fifo); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 fifo_used (fifo_obj_struct *fifo) +uint32 fifo_used (fifo_struct *fifo) { zf_assert(fifo != NULL); return (fifo->max - fifo->size); // 返回当前 FIFO 缓冲区中数据个数 @@ -127,7 +127,7 @@ uint32 fifo_used (fifo_obj_struct *fifo) // 使用示例 zf_log(fifo_write_element(&fifo, data) == FIFO_SUCCESS, "fifo_write_byte error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat) +fifo_state_enum fifo_write_element (fifo_struct *fifo, uint32 dat) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -171,7 +171,7 @@ fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat) // 使用示例 zf_log(fifo_write_buffer(&fifo, data, 32) == FIFO_SUCCESS, "fifo_write_buffer error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 length) +fifo_state_enum fifo_write_buffer (fifo_struct *fifo, void *dat, uint32 length) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -286,7 +286,7 @@ fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 leng // 使用示例 zf_log(fifo_read_element(&fifo, data, FIFO_READ_ONLY) == FIFO_SUCCESS, "fifo_read_byte error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operation_enum flag) +fifo_state_enum fifo_read_element (fifo_struct *fifo, void *dat, fifo_operation_enum flag) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -348,7 +348,7 @@ fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operat // 使用示例 zf_log(fifo_read_buffer(&fifo, data, &length, FIFO_READ_ONLY) == FIFO_SUCCESS, "fifo_read_buffer error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) +fifo_state_enum fifo_read_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) { zf_assert(NULL != fifo); zf_assert(NULL != length); @@ -447,7 +447,7 @@ fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *leng // 如果使用 FIFO_READ_AND_CLEAN 操作 将会丢弃所有数据并清空整个 FIFO // 如果使用 FIFO_READ_AND_CLEAN 操作 将会丢弃所有数据并清空整个 FIFO //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) +fifo_state_enum fifo_read_tail_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) { zf_assert(NULL != fifo); zf_assert(NULL != length); @@ -541,7 +541,7 @@ fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 // 使用示例 fifo_init(&user_fifo, user_buffer, 64); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_init (fifo_obj_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size) +fifo_state_enum fifo_init (fifo_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; diff --git a/Example/E05_pit_demo/libraries/zf_common/zf_common_fifo.h b/Example/E05_pit_demo/libraries/zf_common/zf_common_fifo.h index 5cc7668..901a913 100644 --- a/Example/E05_pit_demo/libraries/zf_common/zf_common_fifo.h +++ b/Example/E05_pit_demo/libraries/zf_common/zf_common_fifo.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_fifo * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -91,17 +91,17 @@ typedef struct uint32 end; // 缓存尾指针 总是指向非空缓存(缓存全空除外) uint32 size; // 缓存剩余大小 uint32 max; // 缓存总大小 -}fifo_obj_struct; +}fifo_struct; -fifo_state_enum fifo_clear (fifo_obj_struct *fifo); -uint32 fifo_used (fifo_obj_struct *fifo); +fifo_state_enum fifo_clear (fifo_struct *fifo); +uint32 fifo_used (fifo_struct *fifo); -fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat); -fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 length); -fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operation_enum flag); -fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); -fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); +fifo_state_enum fifo_write_element (fifo_struct *fifo, uint32 dat); +fifo_state_enum fifo_write_buffer (fifo_struct *fifo, void *dat, uint32 length); +fifo_state_enum fifo_read_element (fifo_struct *fifo, void *dat, fifo_operation_enum flag); +fifo_state_enum fifo_read_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); +fifo_state_enum fifo_read_tail_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); -fifo_state_enum fifo_init (fifo_obj_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size); +fifo_state_enum fifo_init (fifo_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size); #endif diff --git a/Example/E05_pit_demo/libraries/zf_common/zf_common_font.c b/Example/E05_pit_demo/libraries/zf_common/zf_common_font.c index c816f9d..ee1df09 100644 --- a/Example/E05_pit_demo/libraries/zf_common/zf_common_font.c +++ b/Example/E05_pit_demo/libraries/zf_common/zf_common_font.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_font * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_common/zf_common_font.h b/Example/E05_pit_demo/libraries/zf_common/zf_common_font.h index 24b8602..7531250 100644 --- a/Example/E05_pit_demo/libraries/zf_common/zf_common_font.h +++ b/Example/E05_pit_demo/libraries/zf_common/zf_common_font.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_font * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_common/zf_common_function.c b/Example/E05_pit_demo/libraries/zf_common/zf_common_function.c index d403fb5..acf2739 100644 --- a/Example/E05_pit_demo/libraries/zf_common/zf_common_function.c +++ b/Example/E05_pit_demo/libraries/zf_common/zf_common_function.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_function * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_common/zf_common_function.h b/Example/E05_pit_demo/libraries/zf_common/zf_common_function.h index f5683e1..101b58a 100644 --- a/Example/E05_pit_demo/libraries/zf_common/zf_common_function.h +++ b/Example/E05_pit_demo/libraries/zf_common/zf_common_function.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_function * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_common/zf_common_headfile.h b/Example/E05_pit_demo/libraries/zf_common/zf_common_headfile.h index aa06ef8..86762db 100644 --- a/Example/E05_pit_demo/libraries/zf_common/zf_common_headfile.h +++ b/Example/E05_pit_demo/libraries/zf_common/zf_common_headfile.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_headfile * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -82,7 +82,7 @@ //===================================================外接设备驱动层=================================================== #include "zf_device_absolute_encoder.h" #include "zf_device_bluetooth_ch9141.h" -#include "zf_device_gps_tau1201.h" +#include "zf_device_gnss.h" #include "zf_device_camera.h" #include "zf_device_dl1a.h" #include "zf_device_dl1b.h" @@ -108,6 +108,7 @@ //====================================================应用组件层==================================================== #include "seekfree_assistant.h" +#include "seekfree_assistant_interface.h" //====================================================应用组件层==================================================== //=====================================================用户层====================================================== diff --git a/Example/E05_pit_demo/libraries/zf_common/zf_common_interrupt.c b/Example/E05_pit_demo/libraries/zf_common/zf_common_interrupt.c index 61058b2..af12fe0 100644 --- a/Example/E05_pit_demo/libraries/zf_common/zf_common_interrupt.c +++ b/Example/E05_pit_demo/libraries/zf_common/zf_common_interrupt.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_interrupt * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_common/zf_common_interrupt.h b/Example/E05_pit_demo/libraries/zf_common/zf_common_interrupt.h index 99b0e53..f828423 100644 --- a/Example/E05_pit_demo/libraries/zf_common/zf_common_interrupt.h +++ b/Example/E05_pit_demo/libraries/zf_common/zf_common_interrupt.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_interrupt * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_common/zf_common_typedef.h b/Example/E05_pit_demo/libraries/zf_common/zf_common_typedef.h index bd09f30..9a07c92 100644 --- a/Example/E05_pit_demo/libraries/zf_common/zf_common_typedef.h +++ b/Example/E05_pit_demo/libraries/zf_common/zf_common_typedef.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_typedef * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_components/seekfree_assistant.c b/Example/E05_pit_demo/libraries/zf_components/seekfree_assistant.c index a196e10..0b7cb9d 100644 --- a/Example/E05_pit_demo/libraries/zf_components/seekfree_assistant.c +++ b/Example/E05_pit_demo/libraries/zf_components/seekfree_assistant.c @@ -1,49 +1,71 @@ /********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ -#include "zf_common_fifo.h" + +#include "zf_common_debug.h" + #include "seekfree_assistant.h" -seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 -static seekfree_assistant_camera_struct seekfree_assistant_camera_data; // 图像上位机协议数据 -static seekfree_assistant_camera_dot_struct seekfree_assistant_camera_dot_data; // 图像上位机打点协议数据 -static seekfree_assistant_camera_buffer_struct seekfree_assistant_camera_buffer; // 图像以及边界缓冲区信息 -static fifo_obj_struct seekfree_assistant_fifo; -static uint8 seekfree_assistant_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE]; // 数据存放数组 -float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 保存接收到的参数 -vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 参数更新标志位 +extern uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length); +extern uint32 seekfree_assistant_receive (uint8 *buff, uint32 length); + +#if (1 == SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE) +#include "zf_common_fifo.h" +static uint8 seekfree_assistant_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE]; // FIFO缓冲区 +static fifo_struct seekfree_assistant_fifo = // FIFO结构体 +{ + .buffer = seekfree_assistant_buffer, + .execution = FIFO_IDLE, + .type = FIFO_DATA_8BIT, + .head = 0, + .end = 0, + .size = SEEKFREE_ASSISTANT_BUFFER_SIZE, + .max = SEEKFREE_ASSISTANT_BUFFER_SIZE, +}; +#endif + +static seekfree_assistant_camera_struct seekfree_assistant_camera_data; // 图像上位机协议数据 +static seekfree_assistant_camera_dot_struct seekfree_assistant_camera_dot_data; // 图像上位机打点协议数据 +static seekfree_assistant_camera_buffer_struct seekfree_assistant_camera_buffer; // 图像以及边界缓冲区信息 + +seekfree_assistant_transfer_callback_function seekfree_assistant_transfer_callback = seekfree_assistant_transfer; // 数据发送函数指针 +seekfree_assistant_receive_callback_function seekfree_assistant_receive_callback = seekfree_assistant_receive; // 数据接收函数指针 + +seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 +float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 保存接收到的参数 +vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 参数更新标志位 //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手求和函数 @@ -87,7 +109,7 @@ void seekfree_assistant_camera_data_send (seekfree_assistant_image_type_enum cam seekfree_assistant_camera_data.image_height = height; // 首先发送帧头、功能、摄像头类型、以及宽度高度等信息 - seekfree_assistant_transfer((const uint8 *)&seekfree_assistant_camera_data, sizeof(seekfree_assistant_camera_struct)); + seekfree_assistant_transfer_callback((const uint8 *)&seekfree_assistant_camera_data, sizeof(seekfree_assistant_camera_struct)); // 根据摄像头类型计算图像大小 switch(camera_type) @@ -111,9 +133,8 @@ void seekfree_assistant_camera_data_send (seekfree_assistant_image_type_enum cam // 发送图像数据 if(NULL != image_addr) { - seekfree_assistant_transfer(image_addr, image_size); + seekfree_assistant_transfer_callback(image_addr, image_size); } - } //------------------------------------------------------------------------------------------------------------------- @@ -139,16 +160,15 @@ void seekfree_assistant_camera_dot_send (seekfree_assistant_camera_buffer_struct dot_bytes *= 2; } - // 首先发送帧头、功能、边界编号、坐标长度、点个数 - seekfree_assistant_transfer((const uint8 *)&seekfree_assistant_camera_dot_data, sizeof(seekfree_assistant_camera_dot_struct)); + seekfree_assistant_transfer_callback((const uint8 *)&seekfree_assistant_camera_dot_data, sizeof(seekfree_assistant_camera_dot_struct)); for(i=0; i < SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY; i++) { // 判断是否发送横坐标数据 if(NULL != buffer->boundary_x[i]) { - seekfree_assistant_transfer((const uint8 *)buffer->boundary_x[i], dot_bytes); + seekfree_assistant_transfer_callback((const uint8 *)buffer->boundary_x[i], dot_bytes); } // 判断是否发送纵坐标数据 @@ -156,10 +176,9 @@ void seekfree_assistant_camera_dot_send (seekfree_assistant_camera_buffer_struct { // 如果没有纵坐标数据,则表示每一行只有一个边界 // 指定了横纵坐标数据,这种方式可以实现同一行多个边界的情况,例如搜线算法能够搜索出回弯。 - seekfree_assistant_transfer((const uint8 *)buffer->boundary_y[i], dot_bytes); + seekfree_assistant_transfer_callback((const uint8 *)buffer->boundary_y[i], dot_bytes); } } - } //------------------------------------------------------------------------------------------------------------------- @@ -193,7 +212,7 @@ void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struc // 数据在调用本函数之前,由用户将需要发送的数据写入seekfree_assistant_oscilloscope_data.data[] - seekfree_assistant_transfer((const uint8 *)seekfree_assistant_oscilloscope, packet_size); + seekfree_assistant_transfer_callback((const uint8 *)seekfree_assistant_oscilloscope, packet_size); } //------------------------------------------------------------------------------------------------------------------- @@ -364,12 +383,14 @@ void seekfree_assistant_camera_send (void) } } + //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手解析接收到的数据 // 参数说明 void // 返回参数 void // 使用示例 函数只需要放到周期运行的PIT中断或者主循环即可 //------------------------------------------------------------------------------------------------------------------- +#if (1 == SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE) void seekfree_assistant_data_analysis (void) { uint8 temp_sum; @@ -380,14 +401,13 @@ void seekfree_assistant_data_analysis (void) uint32 temp_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE / 4]; // 尝试读取数据, 如果不是自定义的传输方式则从接收回调中读取数据 - read_length = seekfree_assistant_receive((uint8 *)temp_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); + read_length = seekfree_assistant_receive_callback((uint8 *)temp_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); if(read_length) { // 将读取到的数据写入FIFO fifo_write_buffer(&seekfree_assistant_fifo, (uint8 *)temp_buffer, read_length); } - while(sizeof(seekfree_assistant_parameter_struct) <= fifo_used(&seekfree_assistant_fifo)) { read_length = sizeof(seekfree_assistant_parameter_struct); @@ -416,21 +436,11 @@ void seekfree_assistant_data_analysis (void) } } - // 丢弃无需使用的数据 fifo_read_buffer(&seekfree_assistant_fifo, (uint8 *)temp_buffer, &read_length, FIFO_READ_AND_CLEAN); } } - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 逐飞助手 初始化 -// 参数说明 -// 返回参数 void -// 使用示例 -//------------------------------------------------------------------------------------------------------------------- -ZF_WEAK void seekfree_assistant_init () -{ - fifo_init(&seekfree_assistant_fifo, FIFO_DATA_8BIT, seekfree_assistant_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); -} +#endif + diff --git a/Example/E05_pit_demo/libraries/zf_components/seekfree_assistant.h b/Example/E05_pit_demo/libraries/zf_components/seekfree_assistant.h index d02abb1..ae0f67c 100644 --- a/Example/E05_pit_demo/libraries/zf_components/seekfree_assistant.h +++ b/Example/E05_pit_demo/libraries/zf_components/seekfree_assistant.h @@ -1,69 +1,75 @@ -/*/********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +/********************************************************************************************************************* +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ #ifndef _seekfree_assistant_h_ #define _seekfree_assistant_h_ #include "zf_common_typedef.h" -#include "zf_common_debug.h" + + +// 1:使能参数调节的功能 0:关闭参数调节的功能 +#define SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE ( 1 ) + + // 定义接收FIFO大小 -#define SEEKFREE_ASSISTANT_BUFFER_SIZE ( 0x80 ) +#define SEEKFREE_ASSISTANT_BUFFER_SIZE ( 0x80 ) + +// 定义示波器的最大通道数量 +#define SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT ( 0x08 ) + +// 定义参数调试的最大通道数量 +#define SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT ( 0x08 ) + +// 定义图像边线最大数量 +#define SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY ( 0x08 ) + +// 单片机往上位机发送的帧头 +#define SEEKFREE_ASSISTANT_SEND_HEAD ( 0xAA ) + +// 摄像头类 +#define SEEKFREE_ASSISTANT_CAMERA_FUNCTION ( 0x02 ) +#define SEEKFREE_ASSISTANT_CAMERA_DOT_FUNCTION ( 0x03 ) +#define SEEKFREE_ASSISTANT_CAMERA_OSCILLOSCOPE ( 0x10 ) + +// 上位机往单片机发送的帧头 +#define SEEKFREE_ASSISTANT_RECEIVE_HEAD ( 0x55 ) + +// 参数设置类 +#define SEEKFREE_ASSISTANT_RECEIVE_SET_PARAMETER ( 0x20 ) -// 定义示波器的最大通道数量 -#define SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT ( 0x08 ) - -// 定义参数调试的最大通道数量 -#define SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT ( 0x08 ) - -// 定义图像边线最大数量 -#define SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY ( 0x08 ) - -// 单片机往上位机发送的帧头 -#define SEEKFREE_ASSISTANT_SEND_HEAD ( 0xAA ) - -// 摄像头类 -#define SEEKFREE_ASSISTANT_CAMERA_FUNCTION ( 0x02 ) -#define SEEKFREE_ASSISTANT_CAMERA_DOT_FUNCTION ( 0x03 ) -#define SEEKFREE_ASSISTANT_CAMERA_OSCILLOSCOPE ( 0x10 ) - -// 上位机往单片机发送的帧头 -#define SEEKFREE_ASSISTANT_RECEIVE_HEAD ( 0x55 ) - -// 参数设置类 -#define SEEKFREE_ASSISTANT_RECEIVE_SET_PARAMETER ( 0x20 ) // 摄像头类型枚举 typedef enum @@ -91,71 +97,69 @@ typedef enum typedef struct { - uint8 head; // 帧头 - uint8 channel_num; // 高四位为功能字 低四位为通道数量 - uint8 check_sum; // 和校验 - uint8 length; // 包长度 - float data[SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT]; // 通道数据 + uint8 head; // 帧头 + uint8 channel_num; // 高四位为功能字 低四位为通道数量 + uint8 check_sum; // 和校验 + uint8 length; // 包长度 + float data[SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT]; // 通道数据 }seekfree_assistant_oscilloscope_struct; typedef struct { - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 camera_type; // 低四位表示边界数量 第四位表示是否有图像数据 例如0x13:其中3表示一副图像有三条边界(通常是左边界、中线、右边界)、1表示没有图像数据 - uint8 length; // 包长度(仅包含协议部分) - uint16 image_width; // 图像宽度 - uint16 image_height; // 图像高度 -}seekfree_assistant_camera_struct; - - -typedef struct -{ - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 dot_type; // 点类型 BIT5:1:坐标是16位的 0:坐标是8位的 BIT7-BIT6:0:只有X坐标 1:只有Y坐标 2:X和Y坐标都有 BIT3-BIT0:边界数量 - uint8 length; // 包长度(仅包含协议部分) - uint16 dot_num; // 画点数量 - uint8 valid_flag; // 通道标识 - uint8 reserve; // 保留 -}seekfree_assistant_camera_dot_struct; - -typedef struct -{ - void *image_addr; // 摄像头地址 - uint16 width; // 图像宽度 - uint16 height; // 图像高度 - seekfree_assistant_image_type_enum camera_type; // 摄像头类型 - void *boundary_x[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界横坐标数组地址 - void *boundary_y[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界纵坐标数组地址 + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 camera_type; // 低四位表示边界数量 第四位表示是否有图像数据 例如0x13:其中3表示一副图像有三条边界(通常是左边界、中线、右边界)、1表示没有图像数据 + uint8 length; // 包长度(仅包含协议部分) + uint16 image_width; // 图像宽度 + uint16 image_height; // 图像高度 +}seekfree_assistant_camera_struct; + + +typedef struct +{ + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 dot_type; // 点类型 BIT5:1:坐标是16位的 0:坐标是8位的 BIT7-BIT6:0:只有X坐标 1:只有Y坐标 2:X和Y坐标都有 BIT3-BIT0:边界数量 + uint8 length; // 包长度(仅包含协议部分) + uint16 dot_num; // 画点数量 + uint8 valid_flag; // 通道标识 + uint8 reserve; // 保留 +}seekfree_assistant_camera_dot_struct; + +typedef struct +{ + void *image_addr; // 摄像头地址 + uint16 width; // 图像宽度 + uint16 height; // 图像高度 + seekfree_assistant_image_type_enum camera_type; // 摄像头类型 + void *boundary_x[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界横坐标数组地址 + void *boundary_y[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界纵坐标数组地址 }seekfree_assistant_camera_buffer_struct; typedef struct { - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 channel; // 通道 - uint8 check_sum; // 和校验 - float data; // 数据 + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 channel; // 通道 + uint8 check_sum; // 和校验 + float data; // 数据 }seekfree_assistant_parameter_struct; +typedef uint32 (*seekfree_assistant_transfer_callback_function) (const uint8 *buff, uint32 length); +typedef uint32 (*seekfree_assistant_receive_callback_function) (uint8 *buff, uint32 length); -extern seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 -extern float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 保存接收到的参数 -extern vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 参数更新标志位 +extern seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 +extern float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 保存接收到的参数 +extern vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 参数更新标志位 + + +void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struct *seekfree_assistant_oscilloscope); +void seekfree_assistant_camera_information_config (seekfree_assistant_image_type_enum camera_type, void *image_addr, uint16 width, uint16 height); +void seekfree_assistant_camera_boundary_config (seekfree_assistant_boundary_type_enum boundary_type, uint16 dot_num, void *dot_x1, void *dot_x2, void *dot_x3, void *dot_y1, void *dot_y2, void *dot_y3); +void seekfree_assistant_camera_send (void); +void seekfree_assistant_data_analysis (void); -uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length); -uint32 seekfree_assistant_receive (uint8 *buff, uint32 length); - -void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struct *seekfree_assistant_oscilloscope); - -void seekfree_assistant_camera_information_config (seekfree_assistant_image_type_enum camera_type, void *image_addr, uint16 width, uint16 height); -void seekfree_assistant_camera_boundary_config (seekfree_assistant_boundary_type_enum boundary_type, uint16 dot_num, void *dot_x1, void *dot_x2, void *dot_x3, void *dot_y1, void *dot_y2, void *dot_y3); -void seekfree_assistant_camera_send (void); - -void seekfree_assistant_data_analysis (void); -void seekfree_assistant_init (void); #endif diff --git a/Example/E05_pit_demo/libraries/zf_components/seekfree_assistant_interface.c b/Example/E05_pit_demo/libraries/zf_components/seekfree_assistant_interface.c index 99dbeef..fdade63 100644 --- a/Example/E05_pit_demo/libraries/zf_components/seekfree_assistant_interface.c +++ b/Example/E05_pit_demo/libraries/zf_components/seekfree_assistant_interface.c @@ -1,42 +1,55 @@ /********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant_interface * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ #include "zf_common_typedef.h" +#include "zf_common_fifo.h" #include "zf_common_debug.h" +#include "zf_driver_uart.h" +#include "zf_device_wireless_uart.h" +#include "zf_device_bluetooth_ch9141.h" +#include "zf_device_wifi_uart.h" +#include "zf_device_wifi_spi.h" #include "seekfree_assistant.h" +#include "seekfree_assistant_interface.h" + + +extern seekfree_assistant_transfer_callback_function seekfree_assistant_transfer_callback; // 数据发送函数指针 +extern seekfree_assistant_receive_callback_function seekfree_assistant_receive_callback; // 数据接收函数指针 + + //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手发送函数 // 参数说明 *buff 需要发送的数据地址 @@ -46,11 +59,9 @@ //------------------------------------------------------------------------------------------------------------------- ZF_WEAK uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length) { - uint32 len = 0; - - len = debug_send_buffer(buff, length); - - return len; + + // 当选择自定义通讯方式时 需要自行完成数据发送功能 + return length; } //------------------------------------------------------------------------------------------------------------------- @@ -62,11 +73,57 @@ ZF_WEAK uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length) //------------------------------------------------------------------------------------------------------------------- ZF_WEAK uint32 seekfree_assistant_receive (uint8 *buff, uint32 length) { - uint32 len = 0; + // 当选择自定义通讯方式时 需要自行完成数据接收功能 + return 0; +} - len = debug_read_ring_buffer(buff, length); - - return len; +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 逐飞助手接口 初始化 +// 参数说明 +// 返回参数 void +// 使用示例 seekfree_assistant_interface_init(SEEKFREE_ASSISTANT_WIFI_SPI); 使用高速WIFI SPI模块进行数据收发 +// 备注 需要自行调用设备的初始化,例如使用无线转串口进行数据的收发,则需要自行调用无线转串口的初始化,然后再调用seekfree_assistant_interface_init完成逐飞助手的接口初始化 +//------------------------------------------------------------------------------------------------------------------- +ZF_WEAK void seekfree_assistant_interface_init (seekfree_assistant_transfer_device_enum transfer_device) +{ + switch(transfer_device) + { + case SEEKFREE_ASSISTANT_DEBUG_UART: + { + seekfree_assistant_transfer_callback = debug_send_buffer; + seekfree_assistant_receive_callback = debug_read_ring_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIRELESS_UART: + { + seekfree_assistant_transfer_callback = wireless_uart_send_buffer; + seekfree_assistant_receive_callback = wireless_uart_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_CH9141: + { + seekfree_assistant_transfer_callback = bluetooth_ch9141_send_buffer; + seekfree_assistant_receive_callback = bluetooth_ch9141_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIFI_UART: + { + seekfree_assistant_transfer_callback = wifi_uart_send_buffer; + seekfree_assistant_receive_callback = wifi_uart_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIFI_SPI: + { + seekfree_assistant_transfer_callback = wifi_spi_send_buffer; + seekfree_assistant_receive_callback = wifi_spi_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_CUSTOM: + { + // 根据自己的需求 自行实现seekfree_assistant_transfer与seekfree_assistant_receive函数,完成数据的收发 + + }break; + } } diff --git a/Example/E05_pit_demo/libraries/zf_components/seekfree_assistant_interface.h b/Example/E05_pit_demo/libraries/zf_components/seekfree_assistant_interface.h new file mode 100644 index 0000000..940b5f7 --- /dev/null +++ b/Example/E05_pit_demo/libraries/zf_components/seekfree_assistant_interface.h @@ -0,0 +1,57 @@ +/********************************************************************************************************************* +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 +* Copyright (c) 2022 SEEKFREE 逐飞科技 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 +* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 +* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 +* +* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 +* 甚至没有隐含的适销性或适合特定用途的保证 +* 更多细节请参见 GPL +* +* 您应该在收到本开源库的同时收到一份 GPL 的副本 +* 如果没有,请参阅 +* +* 额外注明: +* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 +* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 +* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 +* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) +* +* 文件名称 seekfree_assistant_interface +* 公司名称 成都逐飞科技有限公司 +* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A +* 店铺链接 https://seekfree.taobao.com/ +* +* 修改记录 +* 日期 作者 备注 +* 2024-1-11 SeekFree first version +********************************************************************************************************************/ + +#ifndef _seekfree_assistant_interface_h_ +#define _seekfree_assistant_interface_h_ + + + +// 数据发送设备枚举 +typedef enum +{ + SEEKFREE_ASSISTANT_DEBUG_UART, // 调试串口 使用的串口由DEBUG_UART_INDEX宏定义指定 + SEEKFREE_ASSISTANT_WIRELESS_UART, // 无线转串口 + SEEKFREE_ASSISTANT_CH9141, // CH9141蓝牙 + SEEKFREE_ASSISTANT_WIFI_UART, // WIFI转串口 + SEEKFREE_ASSISTANT_WIFI_SPI, // 高速WIFI SPI + SEEKFREE_ASSISTANT_CUSTOM, // 自定义通讯方式 需要自行seekfree_assistant_transfer与seekfree_assistant_receive函数 +}seekfree_assistant_transfer_device_enum; + + +void seekfree_assistant_interface_init (seekfree_assistant_transfer_device_enum transfer_device); + + + +#endif diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_absolute_encoder.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_absolute_encoder.c index 7c80a3b..f9bc809 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_absolute_encoder.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_absolute_encoder.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_absolute_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_absolute_encoder.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_absolute_encoder.h index e6cc057..ed92906 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_absolute_encoder.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_absolute_encoder.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_absolute_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c index 500bccb..b0a06df 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_bluetooth_ch9141 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -54,7 +54,7 @@ #include "zf_device_camera.h" #include "zf_device_bluetooth_ch9141.h" -static fifo_obj_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 +static fifo_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 static uint8 bluetooth_ch9141_buffer[BLUETOOTH_CH9141_BUFFER_SIZE]; // 数据存放数组 static uint8 bluetooth_ch9141_data = 0; // 数据临时存放变量 diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h index 800be6c..ffb30b5 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h @@ -24,7 +24,7 @@ * 文件名称 main * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_camera.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_camera.c index 84c7aa0..68668c4 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_camera.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_camera.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_camera * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -45,7 +45,7 @@ #include "zf_device_camera.h" -fifo_obj_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 +fifo_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; // 定义摄像头接收数据缓冲区 uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // 定义摄像头数据发送到上位机的帧头 diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_camera.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_camera.h index 58efb06..2cd7d2d 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_camera.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_camera.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_camera * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -44,7 +44,7 @@ //=================================================摄像头公共库 基本配置================================================ #define CAMERA_RECEIVER_BUFFER_SIZE (8) // 定义摄像头接收数据缓冲区大小 -extern fifo_obj_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 +extern fifo_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 extern uint8 camera_send_image_frame_header[4]; // 声明摄像头数据发送到上位机的帧头 //=================================================摄像头公共库 基本配置================================================ diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_config.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_config.h index af6a3d8..6c8147d 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_config.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_config.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_config * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_dl1a.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_dl1a.c index 3e7410c..27be3a7 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_dl1a.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_dl1a.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1a * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_dl1a.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_dl1a.h index 89145d3..3176dd3 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_dl1a.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_dl1a.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1a * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_dl1b.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_dl1b.c index 90e64b3..96e472e 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_dl1b.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_dl1b.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1b * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_dl1b.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_dl1b.h index b144739..922b3ce 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_dl1b.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_dl1b.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1b * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_gnss.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_gnss.c new file mode 100644 index 0000000..caf7cd0 --- /dev/null +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_gnss.c @@ -0,0 +1,620 @@ +/********************************************************************************************************************* +* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* Copyright (c) 2022 SEEKFREE 逐飞科技 +* +* 本文件是 TC264 开源库的一部分 +* +* TC264 开源库 是免费软件 +* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 +* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 +* +* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 +* 甚至没有隐含的适销性或适合特定用途的保证 +* 更多细节请参见 GPL +* +* 您应该在收到本开源库的同时收到一份 GPL 的副本 +* 如果没有,请参阅 +* +* 额外注明: +* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 +* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 +* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 +* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) +* +* 文件名称 zf_device_gnss +* 公司名称 成都逐飞科技有限公司 +* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 +* 开发环境 ADS v1.9.20 +* 适用平台 TC264D +* 店铺链接 https://seekfree.taobao.com/ +* +* 修改记录 +* 日期 作者 备注 +* 2023-12-28 pudding first version +********************************************************************************************************************/ +/********************************************************************************************************************* +* 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* RX 查看 zf_device_gnss.h 中 GNSS_RX 宏定义 +* TX 查看 zf_device_gnss.h 中 GNSS_TX 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* ------------------------------------ +********************************************************************************************************************/ + +#include "math.h" +#include "zf_common_function.h" +#include "zf_common_fifo.h" +#include "zf_driver_delay.h" +#include "zf_driver_uart.h" + +#include "zf_device_gnss.h" + +#define GNSS_BUFFER_SIZE ( 128 ) + +uint8 gnss_flag = 0; // 1:采集完成等待处理数据 0:没有采集完成 +gnss_info_struct gnss; // GPS解析之后的数据 + +static uint8 gnss_state = 0; // 1:GPS初始化完成 +static fifo_struct gnss_receiver_fifo; // +static uint8 gnss_receiver_buffer[GNSS_BUFFER_SIZE]; // 数据存放数组 + +static gps_state_enum gnss_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 +static gps_state_enum gnss_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 +static gps_state_enum gnss_ths_state = GPS_STATE_RECEIVING; // rmc 语句状态 + +static uint8 gps_gga_buffer[GNSS_BUFFER_SIZE]; +static uint8 gps_rmc_buffer[GNSS_BUFFER_SIZE]; +static uint8 gps_ths_buffer[GNSS_BUFFER_SIZE]; + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 获取指定 ',' 后面的索引 +// 参数说明 num 第几个逗号 +// 参数说明 *str 字符串 +// 返回参数 uint8 返回索引 +// 使用示例 get_parameter_index(1, s); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 get_parameter_index (uint8 num, char *str) +{ + uint8 i = 0, j = 0; + char *temp = strchr(str, '\n'); + uint8 len = 0, len1 = 0; + + 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; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 给定字符串第一个 ',' 之前的数据转换为int +// 参数说明 *s 字符串 +// 返回参数 float 返回数值 +// 使用示例 get_int_number(&buf[get_parameter_index(7, buf)]); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static int get_int_number (char *s) +{ + char buf[10]; + uint8 i = 0; + int return_value = 0; + i = get_parameter_index(1, s); + i = i - 1; + strncpy(buf, s, i); + buf[i] = 0; + return_value = func_str_to_int(buf); + return return_value; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 给定字符串第一个 ',' 之前的数据转换为float +// 参数说明 *s 字符串 +// 返回参数 float 返回数值 +// 使用示例 get_float_number(&buf[get_parameter_index(8, buf)]); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static float get_float_number (char *s) +{ + uint8 i = 0; + char buf[15]; + float return_value = 0; + + i = get_parameter_index(1, s); + i = i - 1; + strncpy(buf, s, i); + buf[i] = 0; + return_value = (float)func_str_to_double(buf); + return return_value; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 给定字符串第一个 ',' 之前的数据转换为double +// 参数说明 *s 字符串 +// 返回参数 double 返回数值 +// 使用示例 get_double_number(&buf[get_parameter_index(3, buf)]); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static double get_double_number (char *s) +{ + uint8 i = 0; + char buf[15]; + double return_value = 0; + + i = get_parameter_index(1, s); + i = i - 1; + strncpy(buf, s, i); + buf[i] = 0; + return_value = func_str_to_double(buf); + return return_value; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 世界时间转换为北京时间 +// 参数说明 *time 保存的时间 +// 返回参数 void +// 使用示例 utc_to_btc(&gnss->time); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static void utc_to_btc (gps_time_struct *time) +{ + uint8 day_num = 0; + + time->hour = time->hour + 8; + if(23 < time->hour) + { + time->hour -= 24; + time->day += 1; + + if(2 == time->month) + { + day_num = 28; + if((0 == time->year % 4 && 0 != time->year % 100) || 0 == time->year % 400) // 判断是否为闰年 + { + day_num ++; // 闰月 2月为29天 + } + } + else + { + day_num = 31; // 1 3 5 7 8 10 12这些月份为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(12 < time->month) + { + time->month -= 12; + time->year ++; + } + } + } +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 RMC语句解析 +// 参数说明 *line 接收到的语句信息 +// 参数说明 *gnss 保存解析后的数据 +// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 +// 使用示例 gps_gnrmc_parse((char *)data_buffer, &gnss); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 gps_gnrmc_parse (char *line, gnss_info_struct *gnss) +{ + uint8 state = 0, temp = 0; + + double latitude = 0; // 纬度 + double longitude = 0; // 经度 + + double lati_cent_tmp = 0, lati_second_tmp = 0; + double long_cent_tmp = 0, long_second_tmp = 0; + float speed_tmp = 0; + char *buf = line; + uint8 return_state = 0; + + state = buf[get_parameter_index(2, buf)]; + + if('A' == state) // 如果数据有效 则解析数据 + { + return_state = 1; + gnss->state = 1; + gnss -> ns = buf[get_parameter_index(4, buf)]; + gnss -> 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)]); + + gnss->latitude_degree = (int)latitude / 100; // 纬度转换为度分秒 + lati_cent_tmp = (latitude - gnss->latitude_degree * 100); + gnss->latitude_cent = (int)lati_cent_tmp; + lati_second_tmp = (lati_cent_tmp - gnss->latitude_cent) * 6000; + gnss->latitude_second = (int)lati_second_tmp; + + gnss->longitude_degree = (int)longitude / 100; // 经度转换为度分秒 + long_cent_tmp = (longitude - gnss->longitude_degree * 100); + gnss->longitude_cent = (int)long_cent_tmp; + long_second_tmp = (long_cent_tmp - gnss->longitude_cent) * 6000; + gnss->longitude_second = (int)long_second_tmp; + + gnss->latitude = gnss->latitude_degree + lati_cent_tmp / 60; + gnss->longitude = gnss->longitude_degree + long_cent_tmp / 60; + + speed_tmp = get_float_number(&buf[get_parameter_index(7, buf)]); // 速度(海里/小时) + gnss->speed = speed_tmp * 1.85f; // 转换为公里/小时 + gnss->direction = get_float_number(&buf[get_parameter_index(8, buf)]); // 角度 + } + else + { + gnss->state = 0; + } + + // 在定位没有生效前也是有时间数据的,可以直接解析 + gnss->time.hour = (buf[7] - '0') * 10 + (buf[8] - '0'); // 时间 + gnss->time.minute = (buf[9] - '0') * 10 + (buf[10] - '0'); + gnss->time.second = (buf[11] - '0') * 10 + (buf[12] - '0'); + temp = get_parameter_index(9, buf); + gnss->time.day = (buf[temp + 0] - '0') * 10 + (buf[temp + 1] - '0'); // 日期 + gnss->time.month = (buf[temp + 2] - '0') * 10 + (buf[temp + 3] - '0'); + gnss->time.year = (buf[temp + 4] - '0') * 10 + (buf[temp + 5] - '0') + 2000; + + utc_to_btc(&gnss->time); + + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 GGA语句解析 +// 参数说明 *line 接收到的语句信息 +// 参数说明 *gnss 保存解析后的数据 +// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 +// 使用示例 gps_gngga_parse((char *)data_buffer, &gnss); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 gps_gngga_parse (char *line, gnss_info_struct *gnss) +{ + uint8 state = 0; + char *buf = line; + uint8 return_state = 0; + + state = buf[get_parameter_index(2, buf)]; + + if(',' != state) + { + gnss->satellite_used = (uint8)get_int_number(&buf[get_parameter_index(7, buf)]); + gnss->height = get_float_number(&buf[get_parameter_index(9, buf)]) + get_float_number(&buf[get_parameter_index(11, buf)]); // 高度 = 海拔高度 + 地球椭球面相对大地水准面的高度 + return_state = 1; + } + + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 THS语句解析 +// 参数说明 *line 接收到的语句信息 +// 参数说明 *gnss 保存解析后的数据 +// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 +// 使用示例 gps_gnths_parse((char *)data_buffer, &gnss); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 gps_gnths_parse (char *line, gnss_info_struct *gnss) +{ + uint8 state = 0; + char *buf = line; + uint8 return_state = 0; + + state = buf[get_parameter_index(2, buf)]; + + if('A' == state) + { + gnss->antenna_direction_state = 1; + gnss->antenna_direction = get_float_number(&buf[get_parameter_index(1, buf)]); + return_state = 1; + } + else + { + gnss->antenna_direction_state = 0; + } + + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 计算从第一个点到第二个点的距离 +// 参数说明 latitude1 第一个点的纬度 +// 参数说明 longitude1 第一个点的经度 +// 参数说明 latitude2 第二个点的纬度 +// 参数说明 longitude2 第二个点的经度 +// 返回参数 double 返回两点距离 +// 使用示例 get_two_points_distance(latitude1_1, longitude1, latitude2, longitude2); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +double get_two_points_distance (double latitude1, double longitude1, double latitude2, double longitude2) +{ + const double EARTH_RADIUS = 6378137; // 地球半径(单位:m) + double rad_latitude1 = 0; + double rad_latitude2 = 0; + double rad_longitude1 = 0; + double rad_longitude2 = 0; + double distance = 0; + double a = 0; + double b = 0; + + rad_latitude1 = ANGLE_TO_RAD(latitude1); // 根据角度计算弧度 + 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 里面实现的算法 + distance = distance * EARTH_RADIUS; + + return distance; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 计算从第一个点到第二个点的方位角 +// 参数说明 latitude1 第一个点的纬度 +// 参数说明 longitude1 第一个点的经度 +// 参数说明 latitude2 第二个点的纬度 +// 参数说明 longitude2 第二个点的经度 +// 返回参数 double 返回方位角(0至360) +// 使用示例 get_two_points_azimuth(latitude1_1, longitude1, latitude2, longitude2); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +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 ((0 < angle) ? angle : (angle + 360)); +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 解析GPS数据 +// 参数说明 void +// 返回参数 uint8 0-解析成功 1-解析失败 可能数据包错误 +// 使用示例 gps_data_parse(); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +uint8 gnss_data_parse (void) +{ + uint8 return_state = 0; + uint8 check_buffer[5] = {'0', 'x', 0x00, 0x00, 0x00}; + uint8 bbc_xor_origin = 0; + uint8 bbc_xor_calculation = 0; + uint32 data_len = 0; + + do + { + if(GPS_STATE_RECEIVED == gnss_rmc_state) + { + gnss_rmc_state = GPS_STATE_PARSING; + strncpy((char *)&check_buffer[2], strchr((const char *)gps_rmc_buffer, '*') + 1, 2); + bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); + for(bbc_xor_calculation = gps_rmc_buffer[1], data_len = 2; '*' != gps_rmc_buffer[data_len]; data_len ++) + { + bbc_xor_calculation ^= gps_rmc_buffer[data_len]; + } + if(bbc_xor_calculation != bbc_xor_origin) + { + // 数据校验失败 + return_state = 1; + break; + } + + gps_gnrmc_parse((char *)gps_rmc_buffer, &gnss); + } + gnss_rmc_state = GPS_STATE_RECEIVING; + + if(GPS_STATE_RECEIVED == gnss_gga_state) + { + gnss_gga_state = GPS_STATE_PARSING; + strncpy((char *)&check_buffer[2], strchr((const char *)gps_gga_buffer, '*') + 1, 2); + bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); + + for(bbc_xor_calculation = gps_gga_buffer[1], data_len = 2; '*' != gps_gga_buffer[data_len]; data_len ++) + { + bbc_xor_calculation ^= gps_gga_buffer[data_len]; + } + if(bbc_xor_calculation != bbc_xor_origin) + { + // 数据校验失败 + return_state = 1; + break; + } + + gps_gngga_parse((char *)gps_gga_buffer, &gnss); + } + gnss_gga_state = GPS_STATE_RECEIVING; + + if(GPS_STATE_RECEIVED == gnss_ths_state) + { + gnss_ths_state = GPS_STATE_PARSING; + strncpy((char *)&check_buffer[2], strchr((const char *)gps_ths_buffer, '*') + 1, 2); + bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); + + for(bbc_xor_calculation = gps_ths_buffer[1], data_len = 2; '*' != gps_ths_buffer[data_len]; data_len ++) + { + bbc_xor_calculation ^= gps_ths_buffer[data_len]; + } + if(bbc_xor_calculation != bbc_xor_origin) + { + // 数据校验失败 + return_state = 1; + break; + } + + gps_gnths_parse((char *)gps_ths_buffer, &gnss); + } + gnss_ths_state = GPS_STATE_RECEIVING; + + }while(0); + return return_state; +} + + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 GPS串口回调函数 +// 参数说明 void +// 返回参数 void +// 使用示例 gps_uart_callback(); +// 备注信息 此函数需要在串口接收中断内进行调用 +//------------------------------------------------------------------------------------------------------------------- +void gnss_uart_callback (void) +{ + uint8 temp_gps[6]; + uint32 temp_length = 0; + + + + + if(gnss_state) + { + uint8 dat; + while(uart_query_byte(GNSS_UART, &dat)) + { + fifo_write_buffer(&gnss_receiver_fifo, &dat, 1); + } + + if('\n' == dat) + { + // 读取前6个数据 用于判断语句类型 + temp_length = 6; + fifo_read_buffer(&gnss_receiver_fifo, temp_gps, &temp_length, FIFO_READ_ONLY); + + // 根据不同类型将数据拷贝到不同的缓冲区 + if(0 == strncmp((char *)&temp_gps[3], "RMC", 3)) + { + // 如果没有在解析数据则更新缓冲区的数据 + if(GPS_STATE_PARSING != gnss_rmc_state) + { + gnss_rmc_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_rmc_buffer, &temp_length, FIFO_READ_AND_CLEAN); + } + } + else if(0 == strncmp((char *)&temp_gps[3], "GGA", 3)) + { + // 如果没有在解析数据则更新缓冲区的数据 + if(GPS_STATE_PARSING != gnss_gga_state) + { + gnss_gga_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_gga_buffer, &temp_length, FIFO_READ_AND_CLEAN); + } + } + else if(0 == strncmp((char *)&temp_gps[3], "THS", 3)) + { + // 如果没有在解析数据则更新缓冲区的数据 + if(GPS_STATE_PARSING != gnss_ths_state) + { + gnss_ths_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_ths_buffer, &temp_length, FIFO_READ_AND_CLEAN); + } + } + + // 统一将FIFO清空 + fifo_clear(&gnss_receiver_fifo); + + gnss_flag = 1; + } + } +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 GPS初始化 +// 参数说明 void +// 返回参数 void +// 使用示例 gps_init(); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +void gnss_init (gps_device_enum gps_device) +{ + 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}; + + if((TAU1201 == gps_device) || (GN42A == gps_device)) + { + fifo_init(&gnss_receiver_fifo, FIFO_DATA_8BIT, gnss_receiver_buffer, GNSS_BUFFER_SIZE); + system_delay_ms(500); // 等待GPS启动后开始初始化 + uart_init(GNSS_UART, 115200, GNSS_RX, GNSS_TX); + + uart_write_buffer(GNSS_UART, (uint8 *)set_rate, sizeof(set_rate)); // 设置GPS更新速率为10hz 如果不调用此语句则默认为1hz + system_delay_ms(200); + + uart_write_buffer(GNSS_UART, (uint8 *)open_rmc, sizeof(open_rmc)); // 开启rmc语句 + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)open_gga, sizeof(open_gga)); // 开启gga语句 + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gll, sizeof(close_gll)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gsa, sizeof(close_gsa)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_grs, sizeof(close_grs)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gsv, sizeof(close_gsv)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_vtg, sizeof(close_vtg)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_zda, sizeof(close_zda)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gst, sizeof(close_gst)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_txt, sizeof(close_txt)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_txt_ant, sizeof(close_txt_ant)); + system_delay_ms(50); + + gnss_state = 1; + uart_rx_interrupt(GNSS_UART, 1); + } + else if(GN43RFA == gps_device) + { + // GN43RFA RTK模块不需要进行参数设置,如果需要修改参数应该使用专用的上位机修改参数 + fifo_init(&gnss_receiver_fifo, FIFO_DATA_8BIT, gnss_receiver_buffer, GNSS_BUFFER_SIZE); + uart_init(GNSS_UART, 115200, GNSS_RX, GNSS_TX); + gnss_state = 1; + uart_rx_interrupt(GNSS_UART, 1); + } + +} diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_gnss.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_gnss.h new file mode 100644 index 0000000..5d58976 --- /dev/null +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_gnss.h @@ -0,0 +1,125 @@ +/********************************************************************************************************************* +* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* Copyright (c) 2022 SEEKFREE 逐飞科技 +* +* 本文件是 TC264 开源库的一部分 +* +* TC264 开源库 是免费软件 +* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 +* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 +* +* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 +* 甚至没有隐含的适销性或适合特定用途的保证 +* 更多细节请参见 GPL +* +* 您应该在收到本开源库的同时收到一份 GPL 的副本 +* 如果没有,请参阅 +* +* 额外注明: +* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 +* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 +* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 +* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) +* +* 文件名称 zf_device_gnss +* 公司名称 成都逐飞科技有限公司 +* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 +* 开发环境 ADS v1.9.20 +* 适用平台 TC264D +* 店铺链接 https://seekfree.taobao.com/ +* +* 修改记录 +* 日期 作者 备注 +* 2023-12-28 pudding first version +********************************************************************************************************************/ +/********************************************************************************************************************* +* 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* RX 查看 zf_device_gnss.h 中 GNSS_RX 宏定义 +* TX 查看 zf_device_gnss.h 中 GNSS_TX 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* ------------------------------------ +********************************************************************************************************************/ + +#ifndef _zf_device_gnss_h_ +#define _zf_device_gnss_h_ + +#include "zf_common_typedef.h" + +//-------------------------------------------------------------------------------------------------- +//引脚配置 +//-------------------------------------------------------------------------------------------------- +#define GNSS_UART (UART_3) +#define GNSS_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 +#define GNSS_TX (UART3_RX_P15_7) // GPS TX串口引脚 + +#define ANGLE_TO_RAD(x) ( (x) * PI / 180.0 ) // 角度转换为弧度 +#define RAD_TO_ANGLE(x) ( (x) * 180.0 / PI ) // 弧度转换为角度 +#define PI ( 3.1415926535898 ) + +typedef enum +{ + TAU1201 = 1, // 逐飞科技双频GPS模块 + GN42A = 1, // 逐飞科技双频GPS模块 与TAU1201是一样的 + GN43RFA = 2, // 逐飞科技三频RTK模块 +}gps_device_enum; + +typedef struct +{ + uint16 year; + uint8 month; + uint8 day; + uint8 hour; + uint8 minute; + uint8 second; +}gps_time_struct; + +typedef struct +{ + gps_time_struct time; // 时间 + + uint8 state; // 有效状态 1:定位有效 0:定位无效 + + uint16 latitude_degree; // 度 + uint16 latitude_cent; // 分 + uint16 latitude_second; // 秒 这里的秒是被放大了100倍的,主要是避免使用浮点数 + uint16 longitude_degree; // 度 + uint16 longitude_cent; // 分 + uint16 longitude_second; // 秒 这里的秒是被放大了100倍的,主要是避免使用浮点数 + + double latitude; // 纬度 + double longitude; // 经度 + + int8 ns; // 纬度半球 N(北半球)或 S(南半球) + int8 ew; // 经度半球 E(东经)或 W(西经) + + float speed; // 速度(公里/每小时) + float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准)+ + uint8 antenna_direction_state; // 双天线测向有效状态 1:测向有效 0:测向无效,无效时antenna_direction数据是无效的 + float antenna_direction; // 主天线指向从天线与真北构成的夹角(000.0~359.9 度) + + // 下面两个个信息从GNGGA语句中获取 + uint8 satellite_used; // 用于定位的卫星数量 + float height; // 高度 +}gnss_info_struct; + +typedef enum +{ + GPS_STATE_RECEIVING, // 正在接收数据 + GPS_STATE_RECEIVED, // 数据接收完成 + GPS_STATE_PARSING, // 正在解析 +}gps_state_enum; + +extern gnss_info_struct gnss; +extern uint8 gnss_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); +uint8 gnss_data_parse (void); +void gnss_uart_callback (void); +void gnss_init (gps_device_enum gps_device); + +#endif diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_gps_tau1201.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_gps_tau1201.c deleted file mode 100644 index da46a99..0000000 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_gps_tau1201.c +++ /dev/null @@ -1,541 +0,0 @@ -/********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 -* Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 -* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 -* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* -* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 -* 甚至没有隐含的适销性或适合特定用途的保证 -* 更多细节请参见 GPL -* -* 您应该在收到本开源库的同时收到一份 GPL 的副本 -* 如果没有,请参阅 -* -* 额外注明: -* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 -* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 -* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 -* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* -* 文件名称 zf_device_gps_tau1201 -* 公司名称 成都逐飞科技有限公司 -* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D -* 店铺链接 https://seekfree.taobao.com/ -* -* 修改记录 -* 日期 作者 备注 -* 2022-09-15 pudding first version -* 2023-04-28 pudding 增加中文注释说明 -********************************************************************************************************************/ -/******************************************************************************************************************** -* 接线定义: -* ------------------------------------ -* 模块管脚 单片机管脚 -* RX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_RX 宏定义 -* TX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_TX 宏定义 -* VCC 3.3V电源 -* GND 电源地 -* ------------------------------------ -********************************************************************************************************************/ - -#include "math.h" -#include "zf_common_function.h" -#include "zf_common_fifo.h" -#include "zf_driver_delay.h" -#include "zf_driver_uart.h" - -#include "zf_device_gps_tau1201.h" - -#define GPS_TAU1201_BUFFER_SIZE ( 128 ) - -uint8 gps_tau1201_flag = 0; // 1:采集完成等待处理数据 0:没有采集完成 -gps_info_struct gps_tau1201; // GPS解析之后的数据 - -static uint8 gps_tau1201_state = 0; // 1:GPS初始化完成 -static fifo_obj_struct gps_tau1201_receiver_fifo; // -static uint8 gps_tau1201_receiver_buffer[GPS_TAU1201_BUFFER_SIZE]; // 数据存放数组 - -gps_state_enum gps_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 -gps_state_enum gps_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 - -static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; // GGA语句缓冲区 -static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; // RMC语句缓冲区 - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 获取指定 ',' 后面的索引 -// 参数说明 num 第几个逗号 -// 参数说明 *str 字符串 -// 返回参数 uint8 返回索引 -// 使用示例 get_parameter_index(1, s); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static uint8 get_parameter_index (uint8 num, char *str) -{ - uint8 i = 0, j = 0; - char *temp = strchr(str, '\n'); - uint8 len = 0, len1 = 0; - - 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; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 给定字符串第一个 ',' 之前的数据转换为int -// 参数说明 *s 字符串 -// 返回参数 float 返回数值 -// 使用示例 get_int_number(&buf[get_parameter_index(7, buf)]); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static int get_int_number (char *s) -{ - char buf[10]; - uint8 i = 0; - int return_value = 0; - i = get_parameter_index(1, s); - i = i - 1; - strncpy(buf, s, i); - buf[i] = 0; - return_value = func_str_to_int(buf); - return return_value; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 给定字符串第一个 ',' 之前的数据转换为float -// 参数说明 *s 字符串 -// 返回参数 float 返回数值 -// 使用示例 get_float_number(&buf[get_parameter_index(8, buf)]); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static float get_float_number (char *s) -{ - uint8 i = 0; - char buf[15]; - float return_value = 0; - - i = get_parameter_index(1, s); - i = i - 1; - strncpy(buf, s, i); - buf[i] = 0; - return_value = (float)func_str_to_double(buf); - return return_value; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 给定字符串第一个 ',' 之前的数据转换为double -// 参数说明 *s 字符串 -// 返回参数 double 返回数值 -// 使用示例 get_double_number(&buf[get_parameter_index(3, buf)]); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static double get_double_number (char *s) -{ - uint8 i = 0; - char buf[15]; - double return_value = 0; - - i = get_parameter_index(1, s); - i = i - 1; - strncpy(buf, s, i); - buf[i] = 0; - return_value = func_str_to_double(buf); - return return_value; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 世界时间转换为北京时间 -// 参数说明 *time 保存的时间 -// 返回参数 void -// 使用示例 utc_to_btc(&gps->time); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static void utc_to_btc (gps_time_struct *time) -{ - uint8 day_num = 0; - - time->hour = time->hour + 8; - if(23 < time->hour) - { - time->hour -= 24; - time->day += 1; - - if(2 == time->month) - { - day_num = 28; - if((0 == time->year % 4 && 0 != time->year % 100) || 0 == time->year % 400) // 判断是否为闰年 - { - day_num ++; // 闰月 2月为29天 - } - } - else - { - day_num = 31; // 1 3 5 7 8 10 12这些月份为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(12 < time->month) - { - time->month -= 12; - time->year ++; - } - } - } -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 RMC语句解析 -// 参数说明 *line 接收到的语句信息 -// 参数说明 *gps 保存解析后的数据 -// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 -// 使用示例 gps_gnrmc_parse((char *)data_buffer, &gps_tau1201); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static uint8 gps_gnrmc_parse (char *line, gps_info_struct *gps) -{ - uint8 state = 0, temp = 0; - - double latitude = 0; // 纬度 - double longitude = 0; // 经度 - - double lati_cent_tmp = 0, lati_second_tmp = 0; - double long_cent_tmp = 0, long_second_tmp = 0; - float speed_tmp = 0; - char *buf = line; - uint8 return_state = 0; - - state = buf[get_parameter_index(2, buf)]; - - gps->state = 0; - if('A' == state) // 如果数据有效 则解析数据 - { - return_state = 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; // 纬度转换为度分秒 - lati_cent_tmp = (latitude - gps->latitude_degree * 100); - gps->latitude_cent = (int)lati_cent_tmp; - lati_second_tmp = (lati_cent_tmp - gps->latitude_cent) * 6000; - gps->latitude_second = (int)lati_second_tmp; - - gps->longitude_degree = (int)longitude / 100; // 经度转换为度分秒 - long_cent_tmp = (longitude - gps->longitude_degree * 100); - gps->longitude_cent = (int)long_cent_tmp; - long_second_tmp = (long_cent_tmp - gps->longitude_cent) * 6000; - gps->longitude_second = (int)long_second_tmp; - - gps->latitude = gps->latitude_degree + lati_cent_tmp / 60; - gps->longitude = gps->longitude_degree + long_cent_tmp / 60; - - speed_tmp = get_float_number(&buf[get_parameter_index(7, buf)]); // 速度(海里/小时) - gps->speed = speed_tmp * 1.85f; // 转换为公里/小时 - gps->direction = get_float_number(&buf[get_parameter_index(8, buf)]); // 角度 - } - - // 在定位没有生效前也是有时间数据的,可以直接解析 - gps->time.hour = (buf[7] - '0') * 10 + (buf[8] - '0'); // 时间 - 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'); // 日期 - 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_state; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 GGA语句解析 -// 参数说明 *line 接收到的语句信息 -// 参数说明 *gps 保存解析后的数据 -// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 -// 使用示例 gps_gngga_parse((char *)data_buffer, &gps_tau1201); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static uint8 gps_gngga_parse (char *line, gps_info_struct *gps) -{ - uint8 state = 0; - char *buf = line; - uint8 return_state = 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)]); // 高度 = 海拔高度 + 地球椭球面相对大地水准面的高度 - return_state = 1; - } - - return return_state; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 计算从第一个点到第二个点的距离 -// 参数说明 latitude1 第一个点的纬度 -// 参数说明 longitude1 第一个点的经度 -// 参数说明 latitude2 第二个点的纬度 -// 参数说明 longitude2 第二个点的经度 -// 返回参数 double 返回两点距离 -// 使用示例 get_two_points_distance(latitude1_1, longitude1, latitude2, longitude2); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -double get_two_points_distance (double latitude1, double longitude1, double latitude2, double longitude2) -{ - const double EARTH_RADIUS = 6378137; // 地球半径(单位:m) - double rad_latitude1 = 0; - double rad_latitude2 = 0; - double rad_longitude1 = 0; - double rad_longitude2 = 0; - double distance = 0; - double a = 0; - double b = 0; - - rad_latitude1 = ANGLE_TO_RAD(latitude1); // 根据角度计算弧度 - 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 里面实现的算法 - distance = distance * EARTH_RADIUS; - - return distance; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 计算从第一个点到第二个点的方位角 -// 参数说明 latitude1 第一个点的纬度 -// 参数说明 longitude1 第一个点的经度 -// 参数说明 latitude2 第二个点的纬度 -// 参数说明 longitude2 第二个点的经度 -// 返回参数 double 返回方位角(0至360) -// 使用示例 get_two_points_azimuth(latitude1_1, longitude1, latitude2, longitude2); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -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 ((0 < angle) ? angle : (angle + 360)); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 解析GPS数据 -// 参数说明 void -// 返回参数 uint8 0-解析成功 1-解析失败 可能数据包错误 -// 使用示例 gps_data_parse(); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -uint8 gps_data_parse (void) -{ - uint8 return_state = 0; - uint8 check_buffer[5] = {'0', 'x', 0x00, 0x00, 0x00}; - uint8 bbc_xor_origin = 0; - uint8 bbc_xor_calculation = 0; - uint32 data_len = 0; - - do - { - if(GPS_STATE_RECEIVED == gps_rmc_state) - { - gps_rmc_state = GPS_STATE_PARSING; - strncpy((char *)&check_buffer[2], strchr((const char *)gps_rmc_buffer, '*') + 1, 2); - bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); - for(bbc_xor_calculation = gps_rmc_buffer[1], data_len = 2; '*' != gps_rmc_buffer[data_len]; data_len ++) - { - bbc_xor_calculation ^= gps_rmc_buffer[data_len]; - } - if(bbc_xor_calculation != bbc_xor_origin) - { - // 数据校验失败 - return_state = 1; - break; - } - - gps_gnrmc_parse((char *)gps_rmc_buffer, &gps_tau1201); - } - gps_rmc_state = GPS_STATE_RECEIVING; - - if(GPS_STATE_RECEIVED == gps_gga_state) - { - gps_gga_state = GPS_STATE_PARSING; - strncpy((char *)&check_buffer[2], strchr((const char *)gps_gga_buffer, '*') + 1, 2); - bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); - - for(bbc_xor_calculation = gps_gga_buffer[1], data_len = 2; '*' != gps_gga_buffer[data_len]; data_len ++) - { - bbc_xor_calculation ^= gps_gga_buffer[data_len]; - } - if(bbc_xor_calculation != bbc_xor_origin) - { - // 数据校验失败 - return_state = 1; - break; - } - - gps_gngga_parse((char *)gps_gga_buffer, &gps_tau1201); - } - gps_gga_state = GPS_STATE_RECEIVING; - - }while(0); - return return_state; -} - - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 GPS串口回调函数 -// 参数说明 void -// 返回参数 void -// 使用示例 gps_uart_callback(); -// 备注信息 此函数需要在串口接收中断内进行调用 -//------------------------------------------------------------------------------------------------------------------- -void gps_uart_callback (void) -{ - uint8 temp_gps[6]; - uint32 temp_length = 0; - - if(gps_tau1201_state) - { - uint8 dat; - while(uart_query_byte(GPS_TAU1201_UART, &dat)) - { - fifo_write_buffer(&gps_tau1201_receiver_fifo, &dat, 1); - } - - if('\n' == dat) - { - // 读取前6个数据 用于判断语句类型 - temp_length = 6; - fifo_read_buffer(&gps_tau1201_receiver_fifo, temp_gps, &temp_length, FIFO_READ_ONLY); - - // 根据不同类型将数据拷贝到不同的缓冲区 - if(0 == strncmp((char *)&temp_gps[3], "RMC", 3)) - { - // 如果没有在解析数据则更新缓冲区的数据 - if(GPS_STATE_PARSING != gps_rmc_state) - { - gps_rmc_state = GPS_STATE_RECEIVED; - temp_length = fifo_used(&gps_tau1201_receiver_fifo); - fifo_read_buffer(&gps_tau1201_receiver_fifo, gps_rmc_buffer, &temp_length, FIFO_READ_AND_CLEAN); - } - } - else if(0 == strncmp((char *)&temp_gps[3], "GGA", 3)) - { - // 如果没有在解析数据则更新缓冲区的数据 - if(GPS_STATE_PARSING != gps_gga_state) - { - gps_gga_state = GPS_STATE_RECEIVED; - temp_length = fifo_used(&gps_tau1201_receiver_fifo); - fifo_read_buffer(&gps_tau1201_receiver_fifo, gps_gga_buffer, &temp_length, FIFO_READ_AND_CLEAN); - } - } - - // 统一将FIFO清空 - fifo_clear(&gps_tau1201_receiver_fifo); - - gps_tau1201_flag = 1; - } - } -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 GPS初始化 -// 参数说明 void -// 返回参数 void -// 使用示例 gps_init(); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -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}; - - fifo_init(&gps_tau1201_receiver_fifo, FIFO_DATA_8BIT, gps_tau1201_receiver_buffer, GPS_TAU1201_BUFFER_SIZE); - system_delay_ms(500); // 等待GPS启动后开始初始化 - uart_init(GPS_TAU1201_UART, 115200, GPS_TAU1201_RX, GPS_TAU1201_TX); - uart_rx_interrupt(GPS_TAU1201_UART, 0); - - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)set_rate, sizeof(set_rate)); // 设置GPS更新速率为10hz 如果不调用此语句则默认为1hz - system_delay_ms(200); - - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)open_rmc, sizeof(open_rmc)); // 开启rmc语句 - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)open_gga, sizeof(open_gga)); // 开启gga语句 - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gll, sizeof(close_gll)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gsa, sizeof(close_gsa)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_grs, sizeof(close_grs)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gsv, sizeof(close_gsv)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_vtg, sizeof(close_vtg)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_zda, sizeof(close_zda)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gst, sizeof(close_gst)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_txt, sizeof(close_txt)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_txt_ant, sizeof(close_txt_ant)); - system_delay_ms(50); - - gps_tau1201_state = 1; - uart_rx_interrupt(GPS_TAU1201_UART, 1); -} diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_gps_tau1201.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_gps_tau1201.h deleted file mode 100644 index c167bae..0000000 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_gps_tau1201.h +++ /dev/null @@ -1,117 +0,0 @@ -/********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 -* Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 -* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 -* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* -* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 -* 甚至没有隐含的适销性或适合特定用途的保证 -* 更多细节请参见 GPL -* -* 您应该在收到本开源库的同时收到一份 GPL 的副本 -* 如果没有,请参阅 -* -* 额外注明: -* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 -* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 -* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 -* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* -* 文件名称 zf_device_gps_tau1201 -* 公司名称 成都逐飞科技有限公司 -* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D -* 店铺链接 https://seekfree.taobao.com/ -* -* 修改记录 -* 日期 作者 备注 -* 2022-09-15 pudding first version -* 2023-04-28 pudding 增加中文注释说明 -********************************************************************************************************************/ -/******************************************************************************************************************** -* 接线定义: -* ------------------------------------ -* 模块管脚 单片机管脚 -* RX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_RX 宏定义 -* TX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_TX 宏定义 -* VCC 3.3V电源 -* GND 电源地 -* ------------------------------------ -********************************************************************************************************************/ - -#ifndef _zf_device_gps_tau1201_h_ -#define _zf_device_gps_tau1201_h_ - -#include "zf_common_typedef.h" - -//=================================================定义 定位模块 基本配置================================================ -#define GPS_TAU1201_UART (UART_3) -#define GPS_TAU1201_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 -#define GPS_TAU1201_TX (UART3_RX_P15_7) // GPS TX串口引脚 - -#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 -#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 -#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; // 时间- - uint8 state; // 有效状态 1:定位有效 0:定位无效 - uint16 latitude_degree; // 度 - uint16 latitude_cent; // 分 - uint16 latitude_second; // 秒 - uint16 longitude_degree; // 度 - uint16 longitude_cent; // 分 - uint16 longitude_second; // 秒 - double latitude; // 纬度 - double longitude; // 经度 - int8 ns; // 纬度半球 N(北半球)或 S(南半球) - int8 ew; // 经度半球 E(东经)或 W(西经) - float speed; // 速度(公里/每小时) - float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) - // 下面两个个信息从GNGGA语句中获取 - uint8 satellite_used; // 用于定位的卫星数量 - float height; // 高度 -}gps_info_struct; - -typedef enum -{ - GPS_STATE_RECEIVING, // 正在接收数据 - GPS_STATE_RECEIVED, // 数据接收完成 - GPS_STATE_PARSING, // 正在解析 -}gps_state_enum; -//================================================定义 定位模块 参数结构体================================================ - - -//=================================================声明 定位模块 全局变量================================================ -extern gps_info_struct gps_tau1201; // GPS解析之后的数据 -extern uint8 gps_tau1201_flag; // 1:采集完成等待处理数据 0:没有采集完成 -//=================================================声明 定位模块 全局变量================================================ - - -//=================================================声明 定位模块 基础函数================================================ -double get_two_points_distance (double lat1, double lng1, double lat2, double lng2); // 计算从第一个点到第二个点的距离(单位:m) -double get_two_points_azimuth (double lat1, double lon1, double lat2, double lon2); // 计算从第一个点到第二个点的方位角(单位:°) -uint8 gps_data_parse (void); // 解析GPS数据 -void gps_uart_callback (void); // GPS回调函数 -void gps_init (void); // GPS初始化 -//=================================================声明 定位模块 基础函数================================================ -#endif diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_icm20602.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_icm20602.c index f4ae830..ddebf3c 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_icm20602.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_icm20602.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_icm20602 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_icm20602.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_icm20602.h index 67724ad..209972b 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_icm20602.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_icm20602.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_icm20602 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_imu660ra.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_imu660ra.c index 95144f9..02fdb9e 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_imu660ra.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_imu660ra.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu660ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_imu660ra.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_imu660ra.h index a689df1..348e6a1 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_imu660ra.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_imu660ra.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu660ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_imu963ra.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_imu963ra.c index 92ec0f6..595142a 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_imu963ra.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_imu963ra.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu963ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_imu963ra.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_imu963ra.h index 4d0d9f9..c0f981f 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_imu963ra.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_imu963ra.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu963ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_ips114.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_ips114.c index 78c6f3b..b13e338 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_ips114.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_ips114.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips114 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_ips114.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_ips114.h index 81dfc3c..ba932b1 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_ips114.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_ips114.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips114 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_ips200.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_ips200.c index cd8681f..37d9d04 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_ips200.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_ips200.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips200 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_ips200.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_ips200.h index ce59927..045bf27 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_ips200.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_ips200.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips200 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_key.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_key.c index 9e42c8a..8b240cb 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_key.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_key.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_key * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_key.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_key.h index bcab8aa..9c653cf 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_key.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_key.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_key * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_mpu6050.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_mpu6050.c index dc3c5b2..101a5ae 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_mpu6050.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_mpu6050.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_mpu6050 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_mpu6050.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_mpu6050.h index 3510e06..c8a086f 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_mpu6050.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_mpu6050.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_mpu6050 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_mt9v03x.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_mt9v03x.c index 231cfec..d38b8df 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_mt9v03x.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_mt9v03x.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_mt9v03x * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_mt9v03x.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_mt9v03x.h index 7786bc5..9d4650d 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_mt9v03x.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_mt9v03x.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_mt9v03x * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_oled.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_oled.c index 5314209..55aefa7 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_oled.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_oled.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_oled * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_oled.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_oled.h index d52d2fd..aadf048 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_oled.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_oled.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_oled * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_ov7725.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_ov7725.c index 12f6095..bac95fe 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_ov7725.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_ov7725.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ov7725 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_ov7725.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_ov7725.h index f45a4e8..2cb4026 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_ov7725.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_ov7725.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ov7725 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_scc8660.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_scc8660.c index 3483c93..38d65ff 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_scc8660.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_scc8660.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_scc8660 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_scc8660.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_scc8660.h index 815d272..537283a 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_scc8660.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_scc8660.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_scc8660 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_tft180.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_tft180.c index db50824..b661e91 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_tft180.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_tft180.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_tft180 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_tft180.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_tft180.h index 47491ee..54a72b3 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_tft180.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_tft180.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_tft180 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_tsl1401.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_tsl1401.c index 3f9db7f..d133c7c 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_tsl1401.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_tsl1401.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_tsl1401 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_tsl1401.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_tsl1401.h index 1fab12e..a7b061c 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_tsl1401.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_tsl1401.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_tsl1401 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_type.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_type.c index 497ba55..af24701 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_type.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_type.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_type * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -32,6 +32,7 @@ * 日期 作者 备注 * 2022-09-15 pudding first version * 2023-05-26 pudding 新增SPI WIFI 中断回调指针 +* 2024-01-16 pudding 移除SPI WIFI 中断回调指针 SPI WIFI将不再使用外部 ********************************************************************************************************************/ #include "zf_device_type.h" @@ -45,7 +46,6 @@ callback_function camera_dma_handler = type_default_callback; wireless_type_enum wireless_type = NO_WIRELESS; callback_function wireless_module_uart_handler = type_default_callback; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 -callback_function wireless_module_spi_handler = type_default_callback; // WIFI SPI GPIO中断函数指针,根据初始化时设置的函数进行跳转 tof_type_enum tof_type = NO_TOF; callback_function tof_module_exti_handler = type_default_callback; // ToF 模块 INT 更新中断 @@ -54,7 +54,7 @@ callback_function tof_module_exti_handler = type_default_callback; // 函数简介 默认回调函数 // 参数说明 void // 返回参数 void -// 使用示例 +// 使用示例 // 备注信息 保护性冗余设计 防止在没有初始化设备的时候跑飞 //------------------------------------------------------------------------------------------------------------------- static void type_default_callback (void) @@ -90,14 +90,7 @@ void set_camera_type (camera_type_enum type_set, callback_function vsync_callba void set_wireless_type (wireless_type_enum type_set, callback_function wireless_callback) { wireless_type = type_set; - if(WIFI_SPI == wireless_type) - { - wireless_module_spi_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); - } - else - { - wireless_module_uart_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); - } + wireless_module_uart_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); } //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_type.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_type.h index 19c36ca..3b124fe 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_type.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_type.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_type * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -56,7 +56,6 @@ typedef enum WIRELESS_UART, // 无线串口 BLUETOOTH_CH9141, // 蓝牙 CH9141 WIFI_UART, // 串口 WiFi - WIFI_SPI // SPI WiFi }wireless_type_enum; typedef enum diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c index 2bdb164..3cbc786 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_virtual_oscilloscope * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h index f518026..b0fd085 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_virtual_oscilloscope * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_wifi_spi.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_wifi_spi.c index 78a6d68..f9e51ca 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_wifi_spi.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_wifi_spi.c @@ -24,14 +24,13 @@ * 文件名称 zf_device_wifi_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 * 日期 作者 备注 -* 2023-05-27 pudding first version -* 2023-05-29 pudding 新增关闭休眠指令,提升通讯效率 +* 2022-09-21 SeekFree first version ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,1374 +52,615 @@ #include "zf_common_clock.h" #include "zf_common_debug.h" #include "zf_common_fifo.h" -#include "zf_common_function.h" #include "zf_driver_delay.h" #include "zf_driver_gpio.h" -#include "zf_common_interrupt.h" -#include "zf_driver_exti.h" #include "zf_driver_spi.h" #include "zf_device_type.h" #include "zf_device_wifi_spi.h" -#define WAIT_TIME_OUT (10000) // 单指令等待时间 单位:ms +#define WIFI_CONNECT_TIME_OUT 10000 // 单位毫秒 +#define SOCKET_CONNECT_TIME_OUT 50000 // 单位毫秒 +#define OTHER_TIME_OUT 1000 // 单位毫秒 -#define WIFI_SPI_WRITE_MAX 128 // 定义一次SPI通讯最大发送的数据长度 - -#define WIFI_SPI_WRITE_REQUEST 0x01 -#define WIFI_SPI_CHECK_STATE 0x02 -#define WIFI_SPI_WRITE_DATA 0x03 -#define WIFI_SPI_READ_DATA 0x04 -#define WIFI_SPI_WRITE_END 0x07 -#define WIFI_SPI_READ_END 0x08 - -#define WIFI_SPI_WRITE_ADDR 0x00 -#define WIFI_SPI_STATE_ADDR 0x04 +char wifi_spi_version[12]; // 保存模块固件版本信息 +char wifi_spi_mac_addr[20]; // 保存模块MAC地址信息 +char wifi_spi_ip_addr_port[25]; // 保存模块IP地址与端口信息 -volatile wifi_spi_buffer_state_enum wifi_buffer_state; -volatile wifi_spi_transmit_state_enum wifi_transmit_state; - -static fifo_obj_struct wifi_spi_fifo; -static uint8 wifi_spi_buffer[WIFI_SPI_BUFFER_SIZE]; // 数据存放数组 - -vuint8 wifi_spi_ack_flag = 0; // 0:模块未应答 1:模块已应答 -uint8 wifi_spi_init_flag; // 0:模块未初始化成功或者未连接 1:模块已连接并成功初始化 -vuint8 wifi_spi_packet_num; // 发送的数据包ID -vuint32 wifi_spi_send_remain_length; // 剩余的发送长度 - - - -wifi_spi_information_struct wifi_spi_information; +static fifo_struct wifi_spi_fifo; +static uint8 wifi_spi_buffer[WIFI_SPI_RECVIVE_FIFO_SIZE]; +static volatile wifi_spi_state_enum wifi_spi_mutex; //------------------------------------------------------------------------------------------------------------------- -// 函数简介 请求写入数据到模块 -// 参数说明 length 需要写入的长度 -// @return void -// Sample usage: +// 函数简介 等待WIFI SPI就绪 +// 参数说明 wait_time 最大等待时间 单位毫秒 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_write_request(uint16 length) +static uint8 wifi_spi_wait_idle (uint32 wait_time) { - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_REQUEST; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - head.magic = 0xFE; - head.sequence = wifi_spi_packet_num++; - head.length = length; + uint32 time = 0; - wifi_transmit_state = TRANSMIT_WRITE_REQUEST; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 7); - gpio_set_level(WIFI_SPI_CS_PIN, 1); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 读取模块状态 -// 参数说明 *length 需要读取或者写入的长度 -// @return WIFI_SPI_BUFFER_STATE_enum 模块状态 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static wifi_spi_buffer_state_enum wifi_spi_read_state(uint16 *length) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_CHECK_STATE; - head.addr = WIFI_SPI_STATE_ADDR; - head.dummy = 0x00; - - wifi_spi_ack_flag = 0; - wifi_transmit_state = TRANSMIT_READ_STATE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_transfer_8bit(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, &head.cmd, 7); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - - if(BUFFER_WRITE == head.magic) + wait_time = wait_time*100; + while(0 == gpio_get_level(WIFI_SPI_INT_PIN)) { - wifi_spi_packet_num = head.sequence; - } - *length = head.length; - - return (wifi_spi_buffer_state_enum)head.magic; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据发送完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_done(void) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_END; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_transmit_state = TRANSMIT_IDLE; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据接收完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_start(void) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_READ_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - wifi_transmit_state = TRANSMIT_READ; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据接收完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_done(void) -{ - wifi_spi_buffer_struct head; - - gpio_set_level(WIFI_SPI_CS_PIN, 1); - - head.cmd = WIFI_SPI_READ_END; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_transmit_state = TRANSMIT_IDLE; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块 -// 参数说明 *buff 需要写入数据的首地址 -// 参数说明 length 需要写入数据的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_data(const uint8 *buff, uint16 length) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - wifi_transmit_state = TRANSMIT_WRITE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - spi_write_8bit_array(WIFI_SPI_INDEX, buff, length); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_spi_send_done(); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_data_multi(wifi_spi_send_multi_struct *multi_buffer) -{ - uint8 i; - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - wifi_transmit_state = TRANSMIT_WRITE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - - for(i = 0; i < WIFI_SPI_MAX_MULTI; i++) - { - if(NULL != multi_buffer->source[i]) spi_write_8bit_array(WIFI_SPI_INDEX, multi_buffer->source[i], multi_buffer->length[i]); - } - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_spi_send_done(); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 接收模块发送的数据 -// 参数说明 *buff 接收数组的缓冲区首地址 -// 参数说明 length 需要接收的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_data(uint8 *buff, uint16 length) -{ - spi_read_8bit_array(WIFI_SPI_INDEX, buff, length); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送命令到模块 -// 参数说明 *str 命令字符串首地址 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_command(const char *str) -{ - uint8 state = 0; - uint16 send_length; - uint16 wait_time = 0; - - // 请求发送数据 - send_length = (uint16)strlen(str); - - // 等待传输进入空闲 - while(TRANSMIT_IDLE != wifi_transmit_state); - - // 如果没有进入发送状态则重新请求发送数据 - while(BUFFER_WRITE != wifi_buffer_state) - { - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - while(!wifi_spi_ack_flag) - { - wait_time++; - if((WAIT_TIME_OUT / 4) <= wait_time) - { - state = 1; - wifi_spi_init_flag = 0; // 模块已断开 - break; - } - system_delay_ms(1); - } - - if(1 == state) + system_delay_us(10); + time++; + if(wait_time <= time) { break; } } - - wifi_buffer_state = BUFFER_IDLE; - - if(0 == state) // 通讯未超时 - { - wifi_spi_send_remain_length = send_length; - // 发送消息 - wifi_spi_send_data((const uint8 *)str, send_length); - } + return (wait_time <= time); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 检查模块状态并读取模块发送的数据 -// 参数说明 void -// @return void -// Sample usage: +// 函数简介 写入数据到WIFI SPI +// 参数说明 *buffer1 第一组需要发送的数据缓冲区地址 +// 参数说明 length1 第一组数据长度 +// 参数说明 *buffer2 第二组需要发送的数据缓冲区地址 +// 参数说明 length2 第二组数据长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -void wifi_spi_check_state_read_buffer(void) +static void wifi_spi_write (const uint8 *buffer1, uint16 length1, const uint8 *buffer2, uint16 length2) { - uint16 wifi_spi_receive_length; // 本次接收到的数据数量 - uint8 wifi_spi_receive_buffer[WIFI_SPI_WRITE_MAX]; - - // 查询WIFI模块的状态 - wifi_buffer_state = wifi_spi_read_state(&wifi_spi_receive_length); - - // 如果需要读取WIFI模块数据,则保存需要读取的长度 - if(BUFFER_READ == wifi_buffer_state) + gpio_low(WIFI_SPI_CS_PIN); + if(NULL != buffer1) { - wifi_spi_receive_start(); - do - { - if(wifi_spi_receive_length > WIFI_SPI_WRITE_MAX) - { - wifi_spi_receive_data((uint8 *)wifi_spi_receive_buffer, WIFI_SPI_WRITE_MAX); - fifo_write_buffer(&wifi_spi_fifo, wifi_spi_receive_buffer, WIFI_SPI_WRITE_MAX); // 存入 FIFO - wifi_spi_receive_length = wifi_spi_receive_length - WIFI_SPI_WRITE_MAX; - } - else - { - wifi_spi_receive_data((uint8 *)wifi_spi_receive_buffer, wifi_spi_receive_length); - fifo_write_buffer(&wifi_spi_fifo, wifi_spi_receive_buffer, wifi_spi_receive_length); // 存入 FIFO - wifi_spi_receive_length = 0; - } - }while(wifi_spi_receive_length > 0); - wifi_spi_receive_done(); + spi_write_8bit_array(WIFI_SPI_INDEX, buffer1, length1); } - else if(BUFFER_IDLE == wifi_buffer_state) + if(NULL != buffer2) { - // 如果模块内部缓冲区状态为空闲,则传输状态也设置为空闲 - wifi_transmit_state = TRANSMIT_IDLE; + spi_write_8bit_array(WIFI_SPI_INDEX, buffer2, length2); } + gpio_high(WIFI_SPI_CS_PIN); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块 -// 参数说明 *buff 需要发送的数据首地址 -// 参数说明 length 需要发送的长度 -// @return uint32 剩余未发送长度 -// Sample usage: +// 函数简介 WIFI SPI 发送与接收同时进行(命令收发) +// 参数说明 *packets 发送与接收的地址 +// 参数说明 length 需要接收的长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_write_data(const uint8 *buff, uint32 length) +static void wifi_spi_transfer_command (wifi_spi_packets_struct *packets, uint16 length) { - uint16 send_length; - uint32 wait_time; + gpio_low(WIFI_SPI_CS_PIN); - // 记录需要发送的长度 - wifi_spi_send_remain_length = length; - - while(wifi_spi_send_remain_length) + spi_transfer_8bit(WIFI_SPI_INDEX, (uint8 *)&(packets->head), (uint8 *)&(packets->head), sizeof(wifi_spi_head_struct)); + + if(length) { - send_length = (uint16)func_limit_ab(wifi_spi_send_remain_length, 1, WIFI_SPI_WRITE_MAX); - - // 请求发送数据 - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - - // 最长等待5秒 - wait_time = 5000; - while(!wifi_spi_ack_flag) - { - wait_time--; - if(0 == wait_time) break; - system_delay_ms(1); - } - - if(BUFFER_WRITE == wifi_buffer_state) - { - // 发送消息 - wifi_spi_send_data(buff, send_length); - buff += send_length; - wifi_spi_send_remain_length -= send_length; - wifi_buffer_state = BUFFER_IDLE; - } - else - { - break; - } + spi_transfer_8bit(WIFI_SPI_INDEX, (const uint8 *)(packets->buffer), packets->buffer, length); } - - return wifi_spi_send_remain_length; + + gpio_high(WIFI_SPI_CS_PIN); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// @return uint32 剩余未发送长度 -// Sample usage: 发送数据总长度不能超过4092个 +// 函数简介 WIFI SPI 发送与接收同时进行(数据收发) +// 参数说明 *write_data 发送的数据缓冲区地址 +// 参数说明 *read_data 接收到的数据的存储地址 +// 参数说明 length 需要接收的长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_write_data_multi(wifi_spi_send_multi_struct *multi_buffer) +static void wifi_spi_transfer_data (const uint8 *write_data, wifi_spi_packets_struct *read_data, uint16 length) { - uint16 send_length; - uint32 wait_time; + gpio_low(WIFI_SPI_CS_PIN); - // 记录需要发送的长度 - send_length = multi_buffer->length[0] + multi_buffer->length[1] + multi_buffer->length[2] + multi_buffer->length[3] + multi_buffer->length[4] + multi_buffer->length[5] + multi_buffer->length[6] + multi_buffer->length[7]; + read_data->head.command = WIFI_SPI_DATA; + read_data->head.length = length; - if(WIFI_SPI_WRITE_MAX >= send_length) + spi_transfer_8bit(WIFI_SPI_INDEX, (uint8 *)&(read_data->head), (uint8 *)&(read_data->head), sizeof(wifi_spi_head_struct)); + + if(WIFI_SPI_RECVIVE_SIZE < length) { - // 请求发送数据 - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - - // 最长等待5秒 - wait_time = 5000; - while(!wifi_spi_ack_flag) - { - wait_time--; - if(0 == wait_time) break; - system_delay_ms(1); - } - - if(BUFFER_WRITE == wifi_buffer_state) - { - // 发送消息 - wifi_spi_send_data_multi(multi_buffer); - send_length = 0; - wifi_buffer_state = BUFFER_IDLE; - } + spi_transfer_8bit(WIFI_SPI_INDEX, write_data, read_data->buffer, WIFI_SPI_RECVIVE_SIZE); + spi_write_8bit_array(WIFI_SPI_INDEX, &write_data[WIFI_SPI_RECVIVE_SIZE], length - WIFI_SPI_RECVIVE_SIZE); } - - return send_length; + else + { + // 将需要发送的数据拷贝到读取缓冲区,避免出现write_data越界访问 + memcpy(read_data->buffer, write_data, length); + spi_transfer_8bit(WIFI_SPI_INDEX, read_data->buffer, read_data->buffer, WIFI_SPI_RECVIVE_SIZE); + } + gpio_high(WIFI_SPI_CS_PIN); } -//-------------------------------------------------------------------------------------------------- -// 函数简介 等待模块响应 -// 参数说明 *wait_buffer 等待的响应的字符串 -// 参数说明 timeout 超时时间 -// 返回参数 uint8 0:模块响应指定数据 1:模块未响应指定数据或超时 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_wait_ack (char *wait_buffer, uint32 timeout) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 参数设置 +// 参数说明 command 命令类型 +// 参数说明 *buffer 参数地址 +// 参数说明 length 参数长度 +// 参数说明 wait_time 最大等待时间 单位100微妙 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_set_parameter (wifi_spi_packets_command_enum command, uint8 *buffer, uint16 length, uint32 wait_time) { - uint8 return_state = 1; - char receiver_buffer[8] = {0, 0, 0, 0, 0, 0, 0, 0}; - uint32 receiver_len = 8; - + uint8 return_state; + wifi_spi_head_struct head; + return_state = 1; do { - system_delay_ms(1); - // 判断接收缓冲区内是否有需要响应的指定数据 如果有 则跳出循环并且返回0 - receiver_len = 8; - fifo_read_tail_buffer(&wifi_spi_fifo, (uint8 *)receiver_buffer, &receiver_len, FIFO_READ_ONLY); + head.command = command; + head.length = length; + + // 等待从机准备就绪 + if(wifi_spi_wait_idle(wait_time)) + { + break; + } - if(strstr(receiver_buffer, wait_buffer)) + wifi_spi_write(&head.command, sizeof(wifi_spi_head_struct), buffer, length); + if(wifi_spi_wait_idle(wait_time)) + { + break; + } + // 接收应答信号 + + head.command = WIFI_SPI_DATA; + head.length = 0; + wifi_spi_transfer_command((wifi_spi_packets_struct *)&head, head.length); + system_delay_us(20); + if(WIFI_SPI_REPLY_OK == head.command) { return_state = 0; - break; } - else if(strstr(receiver_buffer, "ERROR") || strstr(receiver_buffer, "busy")) - { - // 如果接收到报错或者模块忙 则跳出循环并且返回1 - return_state = 1; - break; - } - }while(timeout --); + }while(0); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 清除WiFi接收缓冲区内容 -// 参数说明 void -// 返回参数 void -// 使用示例 wifi_spi_clear_receive_buffer(); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static void wifi_spi_clear_receive_buffer (void) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 模块信息获取 +// 参数说明 command 命令类型 +// 参数说明 *buffer 保存接收到的参数地址 +// 参数说明 wait_time 最大等待时间 单位100微妙 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_parameter (wifi_spi_packets_command_enum command, wifi_spi_packets_struct *read_data, uint32 wait_time) { - // 清空WiFi接收缓冲区 - fifo_clear(&wifi_spi_fifo); -} + uint8 return_state; -//-------------------------------------------------------------------------------------------------- -// 函数简介 模块数据解析 -// 参数说明 *target_buffer 目标存放地址指针 字符串数组 -// 参数说明 *origin_buffer 数据来源地址指针 字符串数组 -// 参数说明 start_char 起始提取字节 例如从 "1234" 中从 '2' 开始提取 就应该填入 '2' -// 参数说明 end_char 结束提取字节 例如从 "1234" 中在 '4' 结束提取 就应该填入 '\0'(0x00 空字符 一般是字符串结尾) -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_data_parse(wifi_spi_information.mac, wifi_spi_receive_buffer, '"', '"'); // 调用获取本机mac地址后,调用此函数提取mac地址 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char start_char, char end_char) -{ - uint8 return_state = 0; - char *location1; - char *location2; - location1 = strchr((char *)origin_buffer, start_char); - if(location1) + return_state = 1; + do { - location1 ++; - location2 = strchr(location1, end_char); - if(location2) + // 等待从机准备就绪 + if(wifi_spi_wait_idle(wait_time)) { - memcpy(target_buffer, location1, location2-location1); + break; } - else + read_data->head.command = command; + wifi_spi_write(&(read_data->head.command), WIFI_SPI_RECVIVE_SIZE, NULL, 0); + + if(wifi_spi_wait_idle(wait_time)) { - return_state = 1; + break; } - } - else - { - return_state = 1; - } + read_data->head.command = WIFI_SPI_DATA; + read_data->head.length = 0; + wifi_spi_transfer_command(read_data, WIFI_SPI_RECVIVE_SIZE); + return_state = 0; + }while(0); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 查看模块版本信息 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_get_version(); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 固件版本获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,固件版本信息以字符串形式保存在wifi_spi_version数组中 +//------------------------------------------------------------------------------------------------------------------- static uint8 wifi_spi_get_version (void) { - char *location1; - uint8 return_state = 0; - uint8 receiver_buffer[256]; - uint32 receiver_len = 256; + uint8 return_state; + wifi_spi_packets_struct temp_packets; - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+GMR\r\n"); - do + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_VERSION, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_VERSION == temp_packets.head.command)) { - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - location1 = strrchr((char *)receiver_buffer, ':'); - if(wifi_spi_data_parse(wifi_spi_information.version, (uint8 *)location1, ':', '(')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - + memcpy(wifi_spi_version, temp_packets.buffer, temp_packets.head.length); + } return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 模块回显设置 -// 参数说明 model 0:关闭模块的回写功能 其他:开启模块回写 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_echo_set("1");//开启模块回写功能 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_echo_set (char *model) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI MAC地址获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,MAC地址信息以字符串形式保存在wifi_spi_mac_addr数组中 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_mac_addr (void) { - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - if('1' == *model) + uint8 return_state; + wifi_spi_packets_struct temp_packets; + + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_MAC_ADDR, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_MAC_ADDR == temp_packets.head.command)) { - wifi_spi_send_command("ATE1\r\n"); + memcpy(wifi_spi_mac_addr, temp_packets.buffer, temp_packets.head.length); + } + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI IP地址与端口号获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 +// 需要在连接Socket之后调用此函数才能正常获取信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_ip_addr_port (void) +{ + uint8 return_state; + wifi_spi_packets_struct temp_packets; + + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_IP_ADDR, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_IP_ADDR == temp_packets.head.command)) + { + memcpy(wifi_spi_ip_addr_port, temp_packets.buffer, temp_packets.head.length); + } + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 设置连接的WiFi信息并尝试连接WiFi +// 参数说明 *wifi_ssid WIFI名称 +// 参数说明 *pass_word WIFI密码 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_wifi_connect("SEEKFREE", "SEEKFREE123"); +// 备注信息 wifi_spi_wifi_connect("SEEKFREE", NULL); // 连接没有密码的WIFI热点 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_wifi_connect (char *wifi_ssid, char *pass_word) +{ + uint8 return_state; + uint8 temp_buffer[64]; + uint16 length; + + if(NULL != pass_word) + { + // WIFI热点有密码发送热点名称与密码 + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n%s\r\n", wifi_ssid, pass_word); } else { - wifi_spi_send_command("ATE0\r\n"); + // WIFI热点没有密码只需要发送热点名称 + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n", wifi_ssid); } - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + return_state = wifi_spi_set_parameter(WIFI_SPI_SET_WIFI_INFORMATION, temp_buffer, length, WIFI_CONNECT_TIME_OUT); + + // 本机IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 + wifi_spi_get_ip_addr_port(); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块自身 的 MAC 地址 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_mac()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_mac (void) -{ - uint8 return_state = 0; - uint8 receiver_buffer[64]; - uint32 receiver_len = 64; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPAPMAC?\r\n"); - do - { - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - if(wifi_spi_data_parse(wifi_spi_information.mac, receiver_buffer, '"', '"')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块或者目标WIFI 的 IP 地址(取决于模块当前的工作模式) -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_ip()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_ip (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_STATION == wifi_spi_information.mode) - { - wifi_spi_send_command("AT+CIPSTA?\r\n"); - } - else if(WIFI_SPI_SOFTAP == wifi_spi_information.mode) - { - wifi_spi_send_command("AT+CIPAP?\r\n"); - } - - do - { - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - uint8 receiver_buffer[128]; - uint32 receiver_len = 128; - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - if(wifi_spi_data_parse(wifi_spi_information.local_ip, receiver_buffer, '"', '"')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块的相关信息 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_information()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_information (void) -{ - uint8 return_state = 0; - do - { - // 获取模块版本号 - if(wifi_spi_get_version()) - { - return_state = 1; - break; - } - // 获取模块IP地址 - if(wifi_spi_get_ip()) - { - return_state = 1; - break; - } - // 获取模块MAC信息 - if(wifi_spi_get_mac()) - { - return_state = 1; - break; - } - memcpy(wifi_spi_information.local_port, "no port", 7); - }while(0); - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 连接 WiFi -// 参数说明 wifi_ssid WiFi名称 -// 参数说明 pass_word WiFi密码 -// 参数说明 model 0:查询WiFi连接情况 其他:连接WiFi -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_get_or_connect_wifi("WiFi_name", "Pass_word", 1); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_wifi (char *wifi_ssid, char *pass_word) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SOFTAP == wifi_spi_information.mode) - { - sprintf(temp, "AT+CWSAP=\"%s\",\"%s\",5,3\r\n", wifi_ssid, pass_word); - wifi_spi_send_command(temp); - } - else - { - sprintf(temp, "AT+CWJAP=\"%s\",\"%s\"\r\n", wifi_ssid, pass_word); - wifi_spi_send_command(temp); - } - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 上电是否自动连接WiFi -// 参数说明 model 0:上电不自动连接wifi 其他:上电自动连接wifi -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_auto_connect_wifi(0); //上电不自动连接wifi -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_auto_connect_wifi (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CWAUTOCONN=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置连接模式 -// 参数说明 model 0: 单连接模式 1:多连接模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_connect_model("1"); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_connect_model (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPMUX=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置传输模式 -// 参数说明 model – 0: 普通传输模式 IP断开后不重新连接 -// – 1: Wi-Fi 透传接收模式,仅支持 TCP 单连接、UDP 固定通信对端、SSL 单连接的情况 IP断开后会不断尝试重新连接 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_transfer_model("1"); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_transfer_model (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPMODE=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置模块模式 (Station/SoftAP/Station+SoftAP) -// 参数说明 state 0:无 Wi-Fi 模式,并且关闭 Wi-Fi RF----1: Station 模式----2: SoftAP 模式----3: SoftAP+Station 模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_model("1"); +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 设置连接的Socket信息并尝试连接Socket +// 参数说明 *transport_type 传输类型 +// 参数说明 *ip_addr IP地址 +// 参数说明 *port 目标端口号 +// 参数说明 *local_port 本机端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_socket_connect("TCP", "192.168.2.5", "8080", "6060"); // 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_set_model (wifi_spi_mode_enum mode) +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_socket_connect (char *transport_type, char *ip_addr, char *port, char *local_port) { - uint8 return_state = 0; + uint8 return_state; + uint8 temp_buffer[41]; + uint16 length; + + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n%s\r\n%s\r\n%s\r\n", transport_type, ip_addr, port, local_port); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + return_state = wifi_spi_set_parameter(WIFI_SPI_SET_SOCKET_INFORMATION, temp_buffer, length, SOCKET_CONNECT_TIME_OUT); - if(WIFI_SPI_SOFTAP == mode) - { - wifi_spi_send_command("AT+CWMODE=2\r\n"); - } - else - { - wifi_spi_send_command("AT+CWMODE=1\r\n"); - } - // 设置模块工作模式 - wifi_spi_information.mode = mode; - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + // 本机IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 + wifi_spi_get_ip_addr_port(); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 关闭睡眠模式 -// 参数说明 mode -// 返回参数 uint8 0:成功 1:失败 +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 断开Socket连接 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_socket_disconnect(); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_socket_disconnect (void) +{ + wifi_spi_packets_struct temp_packets; + + return wifi_spi_get_parameter(WIFI_SPI_CLOSE_SOCKET, &temp_packets, OTHER_TIME_OUT); +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 软复位 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 // 使用示例 // 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_close_sleep_model (void) +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_reset (void) { - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+SLEEP=0\r\n"); - // 设置模块工作模式 - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 断开与wifi的连接 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_disconnected_wifi(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_disconnected_wifi (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CWQAP\r\n"); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 进入打开透传模式 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_entry_serianet(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_entry_serianet (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPSEND\r\n"); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 退出透传模式 -// 参数说明 model 0:关闭透传模式 其他:开启透传模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_exit_serianet(1); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_exit_serianet (void) -{ - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - system_delay_ms(20); - wifi_spi_send_command("+++"); - system_delay_ms(1000); - - return 0; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 建立TCP连接 -// 参数说明 ip 远端 IPv4 地址、IPv6 地址,或域名 -// 参数说明 port 远端端口值 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_connect_tcp_servers("192.168.101.110", "8080"); -// 备注信息 如果总是连接不上电脑的TCP服务器 可以尝试使用网线连接电脑 -// 如果是使用WiFi连接 可能会导致模块连接TCP服务器等待较长时间 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_connect_tcp_servers (char *ip, char *port, wifi_spi_transfer_mode_enum mode) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + uint8 return_state; + wifi_spi_head_struct head; + return_state = 1; do { - if(wifi_spi_set_connect_model("0")) + head.command = WIFI_SPI_RESET; + head.length = 0xA5A5; + return_state = wifi_spi_wait_idle(OTHER_TIME_OUT); + if(return_state) { - return_state = 1; break; } + wifi_spi_write(&head.command, sizeof(wifi_spi_head_struct), NULL, 0); + }while(0); + + return return_state; +} - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPSTARTEX=\"TCP\",\"%s\",%s\r\n", ip, port); - wifi_spi_send_command(temp); - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI UDP模式时立即发送函数 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 在UDP模式下模块收到数据后会等待2毫秒,2毫秒后未收到数据则将数据通过socket发送到网络,如果希望立即发送则在数据传输完毕后调用此函数 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_udp_send_now (void) +{ + uint8 return_state = 1; + wifi_spi_packets_struct temp_packets; + + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + do { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - // 设置传输模式 - if(wifi_spi_set_transfer_model(WIFI_SPI_COMMAND == mode ? "0" : "1")) - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPSTATE?\r\n"); - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - else - { - uint8 receiver_buffer[128]; - uint32 receiver_len = 128; - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - char* buffer_index = (char *)receiver_buffer; - char* end_index; - - buffer_index += 22; - buffer_index += strlen(ip); - buffer_index += strlen(port); - end_index = strchr(buffer_index, ','); - - memcpy(wifi_spi_information.local_port, " ", 7); - memcpy(wifi_spi_information.local_port, buffer_index, (end_index - buffer_index)); - } - - wifi_spi_information.connect_state = WIFI_SPI_SERVER_ON; - wifi_spi_information.connect_mode = WIFI_SPI_TCP_CLIENT; - wifi_spi_information.transfer_mode = mode; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SERIANET == mode) // 透传模式下直接开启透传 - { - if(wifi_spi_entry_serianet()) + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) { - return_state = 1; break; } - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 建立UDP连接 -// 参数说明 *ip 远端 IPv4 地址、IPv6 地址 或域名 字符串形式 -// 参数说明 *port 远端端口值 字符串形式 -// 参数说明 *local_port 远端 IPv4 地址、IPv6 地址 或域名 字符串形式 -// 参数说明 mode 模块数据通信模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_connect_udp_client("192.168.101.110", "8080", "8080", WIFI_SPI_COMMAND); -// 备注信息 自动分配ID -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_connect_udp_client (char *ip, char *port, char *local_port, wifi_spi_transfer_mode_enum mode) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - do - { - if(wifi_spi_set_connect_model("0")) - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + // 立即开始socket发送 + temp_packets.head.command = WIFI_SPI_UDP_SEND; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + + // 等待应答信号 + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + + // 接收应答信号 + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, temp_packets.head.length); + + if(WIFI_SPI_REPLY_OK == temp_packets.head.command) + { + return_state = 0; + } + + }while(0); - sprintf(temp, "AT+CIPSTARTEX=\"UDP\",\"%s\",%s,%s\r\n", ip, port, local_port); - wifi_spi_send_command(temp); + // 将通讯状态设置为空闲 + wifi_spi_mutex = WIFI_SPI_IDLE; + } + + return return_state; +} - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 数据块发送函数并同步接收数据 +// 参数说明 *buff 需要发送的数据地址 +// 参数说明 length 发送长度 +// 返回参数 uint32 剩余未发送的长度 +// 使用示例 wifi_spi_send_buffer(buffer, 100); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +uint32 wifi_spi_send_buffer (const uint8 *buffer, uint32 length) +{ + uint16 send_length; + wifi_spi_packets_struct temp_packets; + + // 检查WIFI SPI状态,如果在其他中断或者线程中已经发起了通讯,则本次不能发送数据 + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + + while(length) { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_spi_set_transfer_model(WIFI_SPI_COMMAND == mode ? "0" : "1")) // 设置传输模式 - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SERIANET == mode) // 透传模式下直接开启透传 - { - if(wifi_spi_entry_serianet()) + send_length = length > WIFI_SPI_TRANSFER_SIZE ? (uint16)WIFI_SPI_TRANSFER_SIZE : (uint16)length; + + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) { - return_state = 1; break; } - } - memcpy(wifi_spi_information.local_port, " ", 7); - memcpy(wifi_spi_information.local_port, local_port, strlen(local_port)); - wifi_spi_information.connect_state = WIFI_SPI_SERVER_ON; - wifi_spi_information.connect_mode = WIFI_SPI_UDP_CLIENT; - wifi_spi_information.transfer_mode = mode; - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 断开连接 TCP Server 使用本接口将会断开所有连接 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_disconnect_link(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_disconnect_link (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - do - { - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - wifi_spi_send_command("AT+CIPCLOSE=5\r\n"); - } - else - { - wifi_spi_send_command("AT+CIPCLOSE\r\n"); - } - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送字节函数 -// 参数说明 data 需要发送的数据 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_byte(0xa5); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_byte (uint8 data) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - send_length = 1; - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data(&data, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else - { - send_length = (uint16)wifi_spi_write_data(&data, send_length); - } - } - } - - return send_length; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送缓冲区函数 -// 参数说明 buff 需要发送的数据地址 -// 参数说明 len 发送长度 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_buffer("123", 3); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 len) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - while(len) - { - if((WIFI_SPI_WRITE_MAX * 2) < len) send_length = WIFI_SPI_WRITE_MAX * 2; - else - { - send_length = (uint16)len; - } - len -= send_length; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data(buff, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } - buff += send_length; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else - { - len = wifi_spi_write_data(buff, len); - } - } - } - - return len; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送缓冲区函数(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 -// 备注信息 需要发送多个数组时,采用此函数可以极大的降低通讯时间,发送数据总长度不能超过4092 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_buffer_multi (wifi_spi_send_multi_struct *multi_buffer) -{ - uint8 i; - uint16 remain_length; - - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - for(i = 0; i < WIFI_SPI_MAX_MULTI; i++) - { - if(multi_buffer->source[i]) wifi_spi_send_buffer(multi_buffer->source[i], multi_buffer->length[i]); - } - } - else - { - remain_length = (uint16)wifi_spi_write_data_multi(multi_buffer); - } - } - } - - return remain_length; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送字符串函数 -// 参数说明 *str 需要发送的数据 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_string("123"); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_string (const char *str) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - send_length = (uint16)strlen(str); - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data((uint8 *)str, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } + wifi_spi_transfer_data(buffer, &temp_packets, send_length); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) { - send_length = (uint16)wifi_spi_write_data((uint8 *)str, send_length); + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + + length -= send_length; + buffer += send_length; + } + + // 检查最后一次的接收是否将所有的数据都接收完毕 + while(WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) + { + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + + // 继续读取模块剩余数据 + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } } } + wifi_spi_mutex = WIFI_SPI_IDLE; } - - return send_length; + return length; } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi 模块数据接收函数 -// 参数说明 buffer 接收数据的存放地址 -// 参数说明 len 数组长度,可直接填写或者使用sizeof求得 -// 返回参数 uint32 返回实际接收到的数据长度 -// 使用示例 uint8 test_buffer[256]; wifi_spi_read_buffer(&test_buffer[0], sizeof(test_buffer)); +// 函数简介 WIFI SPI 读取缓冲区 +// 参数说明 *buff 接收缓冲区 +// 参数说明 length 读取数据长度 +// 返回参数 uint32 实际读取数据长度 +// 使用示例 wifi_spi_read_buffer(buffer, 100); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 len) +uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 length) { - fifo_read_buffer(&wifi_spi_fifo, buffer, &len, FIFO_READ_AND_CLEAN); - return len; + zf_assert(NULL != buffer); + uint32 data_len = length; + +#if(1 == WIFI_SPI_READ_TRANSFER) + + wifi_spi_packets_struct temp_packets; + // 检查WIFI SPI状态,如果在其他中断或者线程中已经发起了通讯,则本次不能发送数据 + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + + // 发起通讯查看模块内是否有数据未读取 + do + { + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + }while(WIFI_SPI_REPLY_DATA_START == temp_packets.head.command); + wifi_spi_mutex = WIFI_SPI_IDLE; + } +#endif + + fifo_read_buffer(&wifi_spi_fifo, buffer, &data_len, FIFO_READ_AND_CLEAN); + return data_len; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 wifi spi handshake中断回调函数 -// 参数说明 void -// 返回参数 void -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -void wifi_spi_callback (void) -{ - wifi_spi_check_state_read_buffer(); - wifi_spi_ack_flag = 1; // ACK标志位置1 -} - - //------------------------------------------------------------------------------------------------------------------- // 函数简介 WiFi 模块初始化 // 参数说明 *wifi_ssid 目标连接的 WiFi 的名称 字符串形式 // 参数说明 *pass_word 目标连接的 WiFi 的密码 字符串形式 -// 参数说明 wifi_mode 模块的工作模式 参照 zf_device_wireless_spi.h 中 wifi_spi_mode_enum 枚举 // 返回参数 uint8 模块初始化状态 0-成功 1-错误 -// 使用示例 wifi_spi_init("SEEKFREE_2.4G", "SEEKFREEV2", WIFI_UART_STATION); -// 备注信息 初始化会首先设置串口配置,之后会对模块进行基本参数配置 -// 具体的配置信息可以在 zf_device_wireless_spi.h 文件中修改 +// 使用示例 wifi_spi_init("SEEKFREE", "SEEKFREE123"); +// 备注信息 wifi_spi_init("SEEKFREE", NULL); // 连接没有密码的WIFI热点 //------------------------------------------------------------------------------------------------------------------- -uint8 wifi_spi_init (char *wifi_ssid, char *pass_word, wifi_spi_mode_enum wifi_mode) +uint8 wifi_spi_init (char *wifi_ssid, char *pass_word) { uint8 return_state = 0; - uint32 temp_isr; - - spi_init(WIFI_SPI_INDEX, SPI_MODE0, WIFI_SPI_SPEED, WIFI_SPI_SCK_PIN, WIFI_SPI_MOSI_PIN, WIFI_SPI_MISO_PIN, SPI_CS_NULL);//硬件SPI初始化 - set_wireless_type(WIFI_SPI, wifi_spi_callback); - fifo_init(&wifi_spi_fifo, FIFO_DATA_8BIT, wifi_spi_buffer, WIFI_SPI_BUFFER_SIZE); + fifo_init(&wifi_spi_fifo, FIFO_DATA_8BIT, wifi_spi_buffer, WIFI_SPI_RECVIVE_FIFO_SIZE); + spi_init(WIFI_SPI_INDEX, SPI_MODE3, WIFI_SPI_SPEED, WIFI_SPI_SCK_PIN, WIFI_SPI_MOSI_PIN, WIFI_SPI_MISO_PIN, SPI_CS_NULL);//硬件SPI初始化 gpio_init(WIFI_SPI_CS_PIN, GPO, 1, GPO_PUSH_PULL); gpio_init(WIFI_SPI_RST_PIN, GPO, 1, GPO_PUSH_PULL); - - temp_isr = interrupt_global_disable(); - - exti_init(WIFI_SPI_INT_PIN, EXTI_TRIGGER_RISING); - + gpio_init(WIFI_SPI_INT_PIN, GPI, 0, GPI_PULL_DOWN); + + // 复位 gpio_set_level(WIFI_SPI_RST_PIN, 0); - system_delay_ms(50); + system_delay_ms(10); gpio_set_level(WIFI_SPI_RST_PIN, 1); - system_delay_ms(1000); + + // 等待模块初始化 + system_delay_ms(100); + wifi_spi_mutex = WIFI_SPI_IDLE; - exti_flag_clear(WIFI_SPI_INT_PIN); - - interrupt_global_enable(temp_isr); do { - if(wifi_spi_echo_set("0")) // 关闭模块回写 + // 固件版本信息以字符串形式保存在wifi_spi_version数组中 + return_state = wifi_spi_get_version(); + if(return_state) + { + break; + } + + // MAC地址信息以字符串形式保存在wifi_spi_mac_addr数组中 + wifi_spi_get_mac_addr(); + + + return_state = wifi_spi_wifi_connect(wifi_ssid, pass_word); + if(return_state) { - zf_log(0, "exit echo failed"); - return_state = 1; break; } - if(wifi_spi_auto_connect_wifi("0")) // 关闭自动连接 + #if(1 == WIFI_SPI_AUTO_CONNECT) + return_state = wifi_spi_socket_connect("TCP", WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT); + if(return_state) { - zf_log(0, "close auto connect failed"); - return_state = 1; break; } - - if(wifi_spi_set_model(wifi_mode)) // 设置运行模式 + #endif + + #if(2 == WIFI_SPI_AUTO_CONNECT) + return_state = wifi_spi_socket_connect("UDP", WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT); + if(return_state) { - zf_log(0, "set run mode failed"); - return_state = 1; break; } - - if(wifi_spi_close_sleep_model()) // 关闭睡眠模式 - { - zf_log(0, "set sleep mode failed"); - return_state = 1; - break; - } - - if(wifi_spi_set_wifi((char *)wifi_ssid, (char *)pass_word)) // 连接 wifi 或者开启热点 - { - zf_log(0, "wifi set failed"); - return_state = 1; - break; - } - - if(wifi_spi_get_information()) // 模块基本参数获取 - { - zf_log(0, "get module information failed"); - return_state = 1; - break; - } -#if WIFI_SPI_AUTO_CONNECT == 1 - if(wifi_spi_connect_tcp_servers(WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_SERIANET)) // 连接TCP服务器 - { - zf_log(0, "connect TCP server failed"); - return_state = 1; - break; - } -#endif -#if WIFI_SPI_AUTO_CONNECT == 2 - if(wifi_spi_connect_udp_client(WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT, WIFI_SPI_SERIANET)) // 建立UDP连接 - { - zf_log(0, "connect UDP server failed"); - return_state = 1; - break; - } -#endif - // 模块初始化成功 - wifi_spi_init_flag = 1; + #endif }while(0); - + return return_state; } diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_wifi_spi.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_wifi_spi.h index 5e5a025..24e7eb1 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_wifi_spi.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_wifi_spi.h @@ -24,13 +24,13 @@ * 文件名称 zf_device_wifi_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 * 日期 作者 备注 -* 2023-05-27 pudding first version +* 2024-01-18 SeekFree first version ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,128 +53,100 @@ #include "zf_common_typedef.h" + #define WIFI_SPI_INDEX (SPI_3 ) // 定义使用的SPI号 -#define WIFI_SPI_SPEED (30 * 1000 * 1000 ) // 硬件 SPI 速率 +#define WIFI_SPI_SPEED (50 * 1000 * 1000 ) // 硬件 SPI 速率 #define WIFI_SPI_SCK_PIN (SPI3_SCLK_P22_3 ) // 定义SPI_SCK引脚 #define WIFI_SPI_MOSI_PIN (SPI3_MOSI_P22_0 ) // 定义SPI_MOSI引脚 #define WIFI_SPI_MISO_PIN (SPI3_MISO_P22_1 ) // 定义SPI_MISO引脚 IPS没有MISO引脚,但是这里任然需要定义,在spi的初始化时需要使用 #define WIFI_SPI_CS_PIN (P22_2 ) // 定义SPI_CS引脚 采用软件CS引脚 -#define WIFI_SPI_INT_PIN (ERU_CH5_REQ1_P15_8) // 定义中断引脚 +#define WIFI_SPI_INT_PIN (P15_8 ) // 定义握手引脚 #define WIFI_SPI_RST_PIN (P23_1 ) // 定义复位引脚 - - -#define WIFI_SPI_BUFFER_SIZE (1024) // 定义SPI接收的缓冲区大小 -#define WIFI_SPI_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不连接 1-自动连接TCP服务器并进入透传模式 2-自动连接UDP服务器并进入透传模式 3:自动建立TCP服务器 - -#if (WIFI_SPI_AUTO_CONNECT > 2) + +#define WIFI_SPI_RECVIVE_FIFO_SIZE (1024) // 接收FIFO大小 +#define WIFI_SPI_READ_TRANSFER (1) // 在调用wifi_spi_read_buffer 是否尝试发起SPI通讯来检测模块内是否有数据需要读取 1:发起SPI通讯 0:不发起SPI通讯,仅读取FIFO + // 如果应用程序中没有任何的地方调用发送函数,则WIFI_SPI_READ_TRANSFER必须设置为1 + +#define WIFI_SPI_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不自动连接 1-自动连接TCP服务器 2-自动连接UDP + +#if (WIFI_SPI_AUTO_CONNECT > 2) #error "WIFI_SPI_AUTO_CONNECT 的值只能为 [0,1,2]" #else -#define WIFI_SPI_TARGET_IP "192.168.2.28" // 连接目标的 IP +#define WIFI_SPI_TARGET_IP "192.168.137.1" // 连接目标的 IP #define WIFI_SPI_TARGET_PORT "8080" // 连接目标的端口 -#define WIFI_SPI_LOCAL_PORT "8080" // 本机端口 +#define WIFI_SPI_LOCAL_PORT "6666" // 本机的端口 0:随机 可设置范围2048-65535 默认 6666 #endif -#define WIFI_SPI_MAX_MULTI (17) // 多地址发送,最大8个地址 -typedef enum -{ - BUFFER_IDLE, // 模块的缓冲区是空闲的 - BUFFER_READ, // 模块的缓冲区有数据需要读取 - BUFFER_WRITE, // 模块的缓冲区是可写的 -}wifi_spi_buffer_state_enum; +#define WIFI_SPI_RECVIVE_SIZE (32) // 每次SPI传输接收的字节数 不允许修改 +#define WIFI_SPI_TRANSFER_SIZE (4088) // 最大SPI传输接收的字节数 不允许修改 + + typedef enum -{ - TRANSMIT_IDLE, // 当前没有传输 - TRANSMIT_WRITE_REQUEST, // 给模块发送了一个传输请求 - TRANSMIT_READ_STATE, // 读取模块状态 - TRANSMIT_READ, // 正在读取模块内部数据 - TRANSMIT_WRITE, // 正在往模块写入数据 -}wifi_spi_transmit_state_enum; - -typedef enum -{ - WIFI_SPI_STATION, // 设备模式 - WIFI_SPI_SOFTAP, // AP模式 -}wifi_spi_mode_enum; - -typedef enum -{ - WIFI_SPI_COMMAND, // 使用命令的方式发送数据 - WIFI_SPI_SERIANET, // 使用透传的方式发送数据 -}wifi_spi_transfer_mode_enum; - -typedef enum -{ - WIFI_SPI_TCP_CLIENT, // 模块连接TCP服务器 - WIFI_SPI_TCP_SERVER, // 模块作为TCP服务器 - WIFI_SPI_UDP_CLIENT, // 模块启用UDP连接 -}wifi_spi_connect_mode_enum; - -typedef enum -{ - WIFI_SPI_SERVER_OFF, // 模块未连接服务器 - WIFI_SPI_SERVER_ON, // 模块已经连接服务器 -}wifi_spi_connect_state_enum; - -typedef enum -{ - WIFI_SPI_LINK_0, // 模块当前链接 0 - WIFI_SPI_LINK_1, // 模块当前链接 1 - WIFI_SPI_LINK_2, // 模块当前链接 2 - WIFI_SPI_LINK_3, // 模块当前链接 3 - WIFI_SPI_LINK_4, // 模块当前链接 4 -}wifi_spi_link_id_enum; - -typedef struct { - uint8 reserve; - uint8 cmd; - uint8 addr; - uint8 dummy; - uint8 magic; - uint8 sequence; - uint16 length; -}wifi_spi_buffer_struct; + // 主机发送的命令 + WIFI_SPI_INVALID1 = 0x00, // 无效数据包 + WIFI_SPI_RESET = 0x01, // 复位命令 + WIFI_SPI_DATA = 0x02, // 透传数据包 + WIFI_SPI_UDP_SEND = 0x03, // UDP下立即发送命令,默认SPI接收数据后2MS未收到数据自动发送数据 + WIFI_SPI_CLOSE_SOCKET = 0x04, // 断开连接 + + WIFI_SPI_SET_WIFI_INFORMATION = 0x10, // 设置WIFI信息命令 + WIFI_SPI_SET_SOCKET_INFORMATION = 0x11, // 设置SOCKET信息命令 + + WIFI_SPI_GET_VERSION = 0x20, // 获取模块版本 + WIFI_SPI_GET_MAC_ADDR = 0x21, // 获取模块MAC地址 + WIFI_SPI_GET_IP_ADDR = 0x22, // 获取模块IP地址 + + // 从机回传的命令 + WIFI_SPI_REPLY_OK = 0x80, // 从机应答的正确命令 + WIFI_SPI_REPLY_ERROR = 0x81, // 从机应答的错误命令 + + WIFI_SPI_REPLY_DATA_START = 0x90, // 从机回传的数据包,并且还有数据需要主机读取 + WIFI_SPI_REPLY_DATA_END = 0x91, // 从机回传的数据包,数据已读取完毕 + + WIFI_SPI_REPLY_VERSION = 0xA0, // 从机回复固件版本 + WIFI_SPI_REPLY_MAC_ADDR = 0xA1, // 从机回复本机MAC地址等信息 + WIFI_SPI_REPLY_IP_ADDR = 0xA2, // 从机回复本机IP地址、端口号 + WIFI_SPI_INVALID2 = 0xFF // 无效数据包 +}wifi_spi_packets_command_enum; + +typedef enum +{ + WIFI_SPI_IDLE, // 模块空闲,可以进行SPI通讯 + WIFI_SPI_BUSY, // 模块正忙,不可进行SPI通讯 +}wifi_spi_state_enum; + + +typedef struct +{ + uint8 command; // 命令字 + uint8 reserve; // 保留 + uint16 length; // 包有效长度 +}wifi_spi_head_struct; + + +typedef struct +{ + wifi_spi_head_struct head; // 帧头 + uint8 buffer[WIFI_SPI_RECVIVE_SIZE]; // 缓冲区 +}wifi_spi_packets_struct; + + +extern char wifi_spi_version[12]; // 固件版本 字符串 +extern char wifi_spi_mac_addr[20]; // 模块MAC地址 字符串 +extern char wifi_spi_ip_addr_port[25]; // IP地址与端口号 字符串 -typedef struct -{ - uint8 version[12]; // 固件版本 字符串形式 - uint8 mac[20]; // 本机 MAC 地址 字符串形式 - uint8 local_ip[17]; // 本机 IP 地址 字符串形式 - uint8 local_port[10]; // 本机端口号 字符串形式 - uint8 remote_ip[5][17]; // 远端 IP 地址 字符串形式 - wifi_spi_mode_enum mode; // WIFI 模式 - wifi_spi_transfer_mode_enum transfer_mode; // 当前传输模式 - wifi_spi_connect_mode_enum connect_mode; // 网络连接模式 - wifi_spi_connect_state_enum connect_state; // 服务器连接情况 -}wifi_spi_information_struct; +uint8 wifi_spi_wifi_connect (char *wifi_ssid, char *pass_word); +uint8 wifi_spi_socket_connect (char *transport_type, char *ip_addr, char *port, char *local_port); +uint8 wifi_spi_socket_disconnect (void); +uint8 wifi_spi_udp_send_now (void); +uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 length); +uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 length); -typedef struct -{ - uint8 *source[WIFI_SPI_MAX_MULTI]; - uint16 length[WIFI_SPI_MAX_MULTI]; -}wifi_spi_send_multi_struct; - -extern wifi_spi_information_struct wifi_spi_information; - - -uint8 wifi_spi_disconnected_wifi (void); // 断开 WIFI 连接 -uint8 wifi_spi_entry_serianet (void); // 打开透传模式 -uint8 wifi_spi_exit_serianet (void); // 关闭透传模式 - -uint8 wifi_spi_connect_tcp_servers (char *ip, char *port, wifi_spi_transfer_mode_enum mode); // 建立 TCP 连接 -uint8 wifi_spi_connect_udp_client (char *ip, char *port, char *local_port, wifi_spi_transfer_mode_enum mode); // 建立 UDP 传输 -uint8 wifi_spi_disconnect_link (void); // 断开连接 TCP Server 使用本接口将会断开所有连接 - -uint32 wifi_spi_send_byte (uint8 data); // WIFI 模块发送字节函数 -uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 length); // WIFI 模块发送缓冲区函数 -uint32 wifi_spi_send_buffer_multi (wifi_spi_send_multi_struct *multi_buffer); // WIFI 模块发送多缓冲区函数 -uint32 wifi_spi_send_string (const char *str); // WIFI 模块发送字符串函数 - -uint32 wifi_spi_read_buffer (uint8 *buff, uint32 len); // WIFI 模块数据接收函数 - -uint8 wifi_spi_init (char *wifi_ssid, char *pass_word, wifi_spi_mode_enum wifi_mode); // WIFI 模块初始化函数 +uint8 wifi_spi_init (char *wifi_ssid, char *pass_word); #endif + diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_wifi_uart.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_wifi_uart.c index 312dab7..ff728bb 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_wifi_uart.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_wifi_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_wifi_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -61,7 +61,7 @@ wifi_uart_information_struct wifi_uart_information; // 模块自身参数 -static fifo_obj_struct wifi_uart_fifo; +static fifo_struct wifi_uart_fifo; static uint8 wifi_uart_buffer[WIFI_UART_BUFFER_SIZE]; // 数据存放数组 static uint8 wifi_uart_data; diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_wifi_uart.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_wifi_uart.h index abcb253..3316b6f 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_wifi_uart.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_wifi_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_wifi_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_wireless_uart.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_wireless_uart.c index eac2867..91ec013 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_wireless_uart.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_wireless_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_wireless_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -53,7 +53,7 @@ #include "zf_device_type.h" #include "zf_device_wireless_uart.h" -static fifo_obj_struct wireless_uart_fifo; +static fifo_struct wireless_uart_fifo; static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; static uint8 wireless_uart_data = 0; diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_wireless_uart.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_wireless_uart.h index 2418545..a789ad0 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_wireless_uart.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_wireless_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_wireless_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -61,11 +61,11 @@ // 注意事项2:开启自动波特率务必连接RTS引脚 否则会开启失败。 // 注意事项3:模块自动波特率失败的话 可以尝试断电重启 -// 开启自动波特率务必阅读上面两条 注意事项 -// 开启自动波特率务必阅读上面两条 注意事项 -// 开启自动波特率务必阅读上面两条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 -// 0:关闭自动波特率 +// 0:关闭自动波特率 // 1:开启自动波特率 自动波特率的作用是修改 WIRELESS_UART_BAUD 之后不需要对模块进行配置 模块会自动设置为对应的波特率 #define WIRELESS_UART_AUTO_BAUD_RATE ( 1 ) diff --git a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_adc.c b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_adc.c index 9a262a1..06694d8 100644 --- a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_adc.c +++ b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_adc.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_adc * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_adc.h b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_adc.h index 378b67e..f017c76 100644 --- a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_adc.h +++ b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_adc.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_adc * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_delay.c b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_delay.c index 4ec533c..ae3e610 100644 --- a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_delay.c +++ b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_delay.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_delay * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_delay.h b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_delay.h index e8d82ef..7b8b475 100644 --- a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_delay.h +++ b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_delay.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_delay * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_dma.c b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_dma.c index f72f1d6..43bffbc 100644 --- a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_dma.c +++ b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_dma.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_dma * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_dma.h b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_dma.h index 1ec555b..320d40c 100644 --- a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_dma.h +++ b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_dma.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_dma * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_encoder.c b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_encoder.c index 6592198..0e0e0b9 100644 --- a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_encoder.c +++ b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_encoder.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_encoder.h b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_encoder.h index 68d159f..e079122 100644 --- a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_encoder.h +++ b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_encoder.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_exti.c b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_exti.c index 72c9a1f..31d270a 100644 --- a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_exti.c +++ b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_exti.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_exti * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_exti.h b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_exti.h index 30f5ef6..b63f9ee 100644 --- a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_exti.h +++ b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_exti.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_exti * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_flash.c b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_flash.c index f91f5a0..325cfed 100644 --- a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_flash.c +++ b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_flash.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_flash * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_flash.h b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_flash.h index 912585a..e7425fd 100644 --- a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_flash.h +++ b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_flash.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_flash * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_gpio.c b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_gpio.c index 5071114..a084353 100644 --- a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_gpio.c +++ b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_gpio.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_gpio * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_gpio.h b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_gpio.h index 2b23be0..550fb8d 100644 --- a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_gpio.h +++ b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_gpio.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_gpio * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_pit.c b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_pit.c index c4dc50d..5e03d38 100644 --- a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_pit.c +++ b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_pit.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pit * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_pit.h b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_pit.h index 5461e05..66854b5 100644 --- a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_pit.h +++ b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_pit.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pit * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_pwm.c b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_pwm.c index ad1059a..24d8d7a 100644 --- a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_pwm.c +++ b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_pwm.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pwm * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_pwm.h b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_pwm.h index d6dce78..51948a4 100644 --- a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_pwm.h +++ b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_pwm.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pwm * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_soft_iic.c b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_soft_iic.c index 9833b62..a349ec7 100644 --- a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_soft_iic.c +++ b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_soft_iic.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_iic * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_soft_iic.h b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_soft_iic.h index a62b262..80db53b 100644 --- a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_soft_iic.h +++ b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_soft_iic.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_iic * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_soft_spi.c b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_soft_spi.c index 292c60b..954fbe3 100644 --- a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_soft_spi.c +++ b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_soft_spi.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_soft_spi.h b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_soft_spi.h index 6a9c207..62858de 100644 --- a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_soft_spi.h +++ b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_soft_spi.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_spi.c b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_spi.c index 1b99196..f817dd9 100644 --- a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_spi.c +++ b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_spi.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -920,7 +920,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 do { - IfxQspi_writeTransmitFifo(moudle, (uint8)(*write_buffer & 0xFF00) >> 8); // 将发送的数据写入缓冲区 + IfxQspi_writeTransmitFifo(moudle, (uint8)((*write_buffer & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 if(read_buffer != NULL) { diff --git a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_spi.h b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_spi.h index e73507e..d15589c 100644 --- a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_spi.h +++ b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_spi.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_timer.c b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_timer.c index a953b92..e085d6e 100644 --- a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_timer.c +++ b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_timer.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_timer * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_timer.h b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_timer.h index 3c86f58..1bb348f 100644 --- a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_timer.h +++ b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_timer.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_timer * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_uart.c b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_uart.c index cd19782..fb89b55 100644 --- a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_uart.c +++ b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_uart.h b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_uart.h index 8d1d111..cdc55ab 100644 --- a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_uart.h +++ b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E05_pit_demo/user/isr.c b/Example/E05_pit_demo/user/isr.c index f81ccb2..a419ee6 100644 --- a/Example/E05_pit_demo/user/isr.c +++ b/Example/E05_pit_demo/user/isr.c @@ -24,7 +24,7 @@ * 文件名称 isr * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -118,7 +118,7 @@ IFX_INTERRUPT(exti_ch1_ch5_isr, 0, EXTI_CH1_CH5_INT_PRIO) { exti_flag_clear(ERU_CH5_REQ1_P15_8); - wireless_module_spi_handler(); // SPI WIFI 中断回调函数 + } } diff --git a/Example/E06_exit_demo/libraries/doc/version.txt b/Example/E06_exit_demo/libraries/doc/version.txt index b841b50..d644136 100644 --- a/Example/E06_exit_demo/libraries/doc/version.txt +++ b/Example/E06_exit_demo/libraries/doc/version.txt @@ -1,3 +1,8 @@ +V3.2.6 + 更新逐飞助手接口函数 调用初始化时直接传参通信类 + 更新wifi SPI驱动文件 提高通信效率 + 更新GPS驱动文件,更名为GNSS,兼容普通定位模块及RTK + V3.2.5 修复延时函数初始化参数及中断向量表问题 V3.2.4 diff --git a/Example/E06_exit_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h b/Example/E06_exit_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h index 28ff689..371e6b6 100644 --- a/Example/E06_exit_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h +++ b/Example/E06_exit_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h @@ -34,7 +34,7 @@ /*------------------------------------------Configuration for IfxScu_cfg.h-------------------------------------------*/ /*********************************************************************************************************************/ /* External oscillator frequency in Hz */ -#define IFX_CFG_SCU_XTAL_FREQUENCY (20000000) /* Allowed values are: 16000000, 20000000 or 40000000 */ +#define IFX_CFG_SCU_XTAL_FREQUENCY (20000000) /* Allowed values are9p: 16000000, 20000000 or 40000000 */ /* PLL frequency in Hz */ #define IFX_CFG_SCU_PLL_FREQUENCY (200000000) /* Allowed values are: 80000000, 133000000, 160000000 * or 200000000 */ diff --git a/Example/E06_exit_demo/libraries/zf_common/zf_common_clock.c b/Example/E06_exit_demo/libraries/zf_common/zf_common_clock.c index 5023270..9872ea9 100644 --- a/Example/E06_exit_demo/libraries/zf_common/zf_common_clock.c +++ b/Example/E06_exit_demo/libraries/zf_common/zf_common_clock.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_clock * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_common/zf_common_clock.h b/Example/E06_exit_demo/libraries/zf_common/zf_common_clock.h index 9face65..2b50396 100644 --- a/Example/E06_exit_demo/libraries/zf_common/zf_common_clock.h +++ b/Example/E06_exit_demo/libraries/zf_common/zf_common_clock.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_clock * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_common/zf_common_debug.c b/Example/E06_exit_demo/libraries/zf_common/zf_common_debug.c index 52c623d..d680265 100644 --- a/Example/E06_exit_demo/libraries/zf_common/zf_common_debug.c +++ b/Example/E06_exit_demo/libraries/zf_common/zf_common_debug.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_debug * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -46,7 +46,7 @@ static volatile uint8 zf_debug_assert_enable = 1; #if DEBUG_UART_USE_INTERRUPT // 如果启用 debug uart 接收中断 uint8 debug_uart_buffer[DEBUG_RING_BUFFER_LEN]; // 数据存放数组 uint8 debug_uart_data; -fifo_obj_struct debug_uart_fifo; +fifo_struct debug_uart_fifo; #endif //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E06_exit_demo/libraries/zf_common/zf_common_debug.h b/Example/E06_exit_demo/libraries/zf_common/zf_common_debug.h index 881a297..4fb4d91 100644 --- a/Example/E06_exit_demo/libraries/zf_common/zf_common_debug.h +++ b/Example/E06_exit_demo/libraries/zf_common/zf_common_debug.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_debug * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_common/zf_common_fifo.c b/Example/E06_exit_demo/libraries/zf_common/zf_common_fifo.c index b010d3e..94f5133 100644 --- a/Example/E06_exit_demo/libraries/zf_common/zf_common_fifo.c +++ b/Example/E06_exit_demo/libraries/zf_common/zf_common_fifo.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_fifo * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -45,7 +45,7 @@ // 使用示例 fifo_head_offset(fifo, 1); // 备注信息 本函数在文件内部调用 用户不用关注 也不可修改 //------------------------------------------------------------------------------------------------------------------- -static void fifo_head_offset (fifo_obj_struct *fifo, uint32 offset) +static void fifo_head_offset (fifo_struct *fifo, uint32 offset) { fifo->head += offset; @@ -63,7 +63,7 @@ static void fifo_head_offset (fifo_obj_struct *fifo, uint32 offset) // 使用示例 fifo_end_offset(fifo, 1); // 备注信息 本函数在文件内部调用 用户不用关注 也不可修改 //------------------------------------------------------------------------------------------------------------------- -static void fifo_end_offset (fifo_obj_struct *fifo, uint32 offset) +static void fifo_end_offset (fifo_struct *fifo, uint32 offset) { fifo->end += offset; @@ -80,7 +80,7 @@ static void fifo_end_offset (fifo_obj_struct *fifo, uint32 offset) // 使用示例 fifo_clear(fifo); // 备注信息 清空当前 FIFO 对象的内存 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_clear (fifo_obj_struct *fifo) +fifo_state_enum fifo_clear (fifo_struct *fifo) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -113,7 +113,7 @@ fifo_state_enum fifo_clear (fifo_obj_struct *fifo) // 使用示例 uint32 len = fifo_used(fifo); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 fifo_used (fifo_obj_struct *fifo) +uint32 fifo_used (fifo_struct *fifo) { zf_assert(fifo != NULL); return (fifo->max - fifo->size); // 返回当前 FIFO 缓冲区中数据个数 @@ -127,7 +127,7 @@ uint32 fifo_used (fifo_obj_struct *fifo) // 使用示例 zf_log(fifo_write_element(&fifo, data) == FIFO_SUCCESS, "fifo_write_byte error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat) +fifo_state_enum fifo_write_element (fifo_struct *fifo, uint32 dat) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -171,7 +171,7 @@ fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat) // 使用示例 zf_log(fifo_write_buffer(&fifo, data, 32) == FIFO_SUCCESS, "fifo_write_buffer error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 length) +fifo_state_enum fifo_write_buffer (fifo_struct *fifo, void *dat, uint32 length) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -286,7 +286,7 @@ fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 leng // 使用示例 zf_log(fifo_read_element(&fifo, data, FIFO_READ_ONLY) == FIFO_SUCCESS, "fifo_read_byte error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operation_enum flag) +fifo_state_enum fifo_read_element (fifo_struct *fifo, void *dat, fifo_operation_enum flag) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -348,7 +348,7 @@ fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operat // 使用示例 zf_log(fifo_read_buffer(&fifo, data, &length, FIFO_READ_ONLY) == FIFO_SUCCESS, "fifo_read_buffer error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) +fifo_state_enum fifo_read_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) { zf_assert(NULL != fifo); zf_assert(NULL != length); @@ -447,7 +447,7 @@ fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *leng // 如果使用 FIFO_READ_AND_CLEAN 操作 将会丢弃所有数据并清空整个 FIFO // 如果使用 FIFO_READ_AND_CLEAN 操作 将会丢弃所有数据并清空整个 FIFO //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) +fifo_state_enum fifo_read_tail_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) { zf_assert(NULL != fifo); zf_assert(NULL != length); @@ -541,7 +541,7 @@ fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 // 使用示例 fifo_init(&user_fifo, user_buffer, 64); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_init (fifo_obj_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size) +fifo_state_enum fifo_init (fifo_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; diff --git a/Example/E06_exit_demo/libraries/zf_common/zf_common_fifo.h b/Example/E06_exit_demo/libraries/zf_common/zf_common_fifo.h index 5cc7668..901a913 100644 --- a/Example/E06_exit_demo/libraries/zf_common/zf_common_fifo.h +++ b/Example/E06_exit_demo/libraries/zf_common/zf_common_fifo.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_fifo * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -91,17 +91,17 @@ typedef struct uint32 end; // 缓存尾指针 总是指向非空缓存(缓存全空除外) uint32 size; // 缓存剩余大小 uint32 max; // 缓存总大小 -}fifo_obj_struct; +}fifo_struct; -fifo_state_enum fifo_clear (fifo_obj_struct *fifo); -uint32 fifo_used (fifo_obj_struct *fifo); +fifo_state_enum fifo_clear (fifo_struct *fifo); +uint32 fifo_used (fifo_struct *fifo); -fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat); -fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 length); -fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operation_enum flag); -fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); -fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); +fifo_state_enum fifo_write_element (fifo_struct *fifo, uint32 dat); +fifo_state_enum fifo_write_buffer (fifo_struct *fifo, void *dat, uint32 length); +fifo_state_enum fifo_read_element (fifo_struct *fifo, void *dat, fifo_operation_enum flag); +fifo_state_enum fifo_read_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); +fifo_state_enum fifo_read_tail_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); -fifo_state_enum fifo_init (fifo_obj_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size); +fifo_state_enum fifo_init (fifo_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size); #endif diff --git a/Example/E06_exit_demo/libraries/zf_common/zf_common_font.c b/Example/E06_exit_demo/libraries/zf_common/zf_common_font.c index c816f9d..ee1df09 100644 --- a/Example/E06_exit_demo/libraries/zf_common/zf_common_font.c +++ b/Example/E06_exit_demo/libraries/zf_common/zf_common_font.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_font * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_common/zf_common_font.h b/Example/E06_exit_demo/libraries/zf_common/zf_common_font.h index 24b8602..7531250 100644 --- a/Example/E06_exit_demo/libraries/zf_common/zf_common_font.h +++ b/Example/E06_exit_demo/libraries/zf_common/zf_common_font.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_font * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_common/zf_common_function.c b/Example/E06_exit_demo/libraries/zf_common/zf_common_function.c index d403fb5..acf2739 100644 --- a/Example/E06_exit_demo/libraries/zf_common/zf_common_function.c +++ b/Example/E06_exit_demo/libraries/zf_common/zf_common_function.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_function * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_common/zf_common_function.h b/Example/E06_exit_demo/libraries/zf_common/zf_common_function.h index f5683e1..101b58a 100644 --- a/Example/E06_exit_demo/libraries/zf_common/zf_common_function.h +++ b/Example/E06_exit_demo/libraries/zf_common/zf_common_function.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_function * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_common/zf_common_headfile.h b/Example/E06_exit_demo/libraries/zf_common/zf_common_headfile.h index aa06ef8..86762db 100644 --- a/Example/E06_exit_demo/libraries/zf_common/zf_common_headfile.h +++ b/Example/E06_exit_demo/libraries/zf_common/zf_common_headfile.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_headfile * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -82,7 +82,7 @@ //===================================================外接设备驱动层=================================================== #include "zf_device_absolute_encoder.h" #include "zf_device_bluetooth_ch9141.h" -#include "zf_device_gps_tau1201.h" +#include "zf_device_gnss.h" #include "zf_device_camera.h" #include "zf_device_dl1a.h" #include "zf_device_dl1b.h" @@ -108,6 +108,7 @@ //====================================================应用组件层==================================================== #include "seekfree_assistant.h" +#include "seekfree_assistant_interface.h" //====================================================应用组件层==================================================== //=====================================================用户层====================================================== diff --git a/Example/E06_exit_demo/libraries/zf_common/zf_common_interrupt.c b/Example/E06_exit_demo/libraries/zf_common/zf_common_interrupt.c index 61058b2..af12fe0 100644 --- a/Example/E06_exit_demo/libraries/zf_common/zf_common_interrupt.c +++ b/Example/E06_exit_demo/libraries/zf_common/zf_common_interrupt.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_interrupt * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_common/zf_common_interrupt.h b/Example/E06_exit_demo/libraries/zf_common/zf_common_interrupt.h index 99b0e53..f828423 100644 --- a/Example/E06_exit_demo/libraries/zf_common/zf_common_interrupt.h +++ b/Example/E06_exit_demo/libraries/zf_common/zf_common_interrupt.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_interrupt * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_common/zf_common_typedef.h b/Example/E06_exit_demo/libraries/zf_common/zf_common_typedef.h index bd09f30..9a07c92 100644 --- a/Example/E06_exit_demo/libraries/zf_common/zf_common_typedef.h +++ b/Example/E06_exit_demo/libraries/zf_common/zf_common_typedef.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_typedef * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_components/seekfree_assistant.c b/Example/E06_exit_demo/libraries/zf_components/seekfree_assistant.c index a196e10..0b7cb9d 100644 --- a/Example/E06_exit_demo/libraries/zf_components/seekfree_assistant.c +++ b/Example/E06_exit_demo/libraries/zf_components/seekfree_assistant.c @@ -1,49 +1,71 @@ /********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ -#include "zf_common_fifo.h" + +#include "zf_common_debug.h" + #include "seekfree_assistant.h" -seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 -static seekfree_assistant_camera_struct seekfree_assistant_camera_data; // 图像上位机协议数据 -static seekfree_assistant_camera_dot_struct seekfree_assistant_camera_dot_data; // 图像上位机打点协议数据 -static seekfree_assistant_camera_buffer_struct seekfree_assistant_camera_buffer; // 图像以及边界缓冲区信息 -static fifo_obj_struct seekfree_assistant_fifo; -static uint8 seekfree_assistant_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE]; // 数据存放数组 -float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 保存接收到的参数 -vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 参数更新标志位 +extern uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length); +extern uint32 seekfree_assistant_receive (uint8 *buff, uint32 length); + +#if (1 == SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE) +#include "zf_common_fifo.h" +static uint8 seekfree_assistant_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE]; // FIFO缓冲区 +static fifo_struct seekfree_assistant_fifo = // FIFO结构体 +{ + .buffer = seekfree_assistant_buffer, + .execution = FIFO_IDLE, + .type = FIFO_DATA_8BIT, + .head = 0, + .end = 0, + .size = SEEKFREE_ASSISTANT_BUFFER_SIZE, + .max = SEEKFREE_ASSISTANT_BUFFER_SIZE, +}; +#endif + +static seekfree_assistant_camera_struct seekfree_assistant_camera_data; // 图像上位机协议数据 +static seekfree_assistant_camera_dot_struct seekfree_assistant_camera_dot_data; // 图像上位机打点协议数据 +static seekfree_assistant_camera_buffer_struct seekfree_assistant_camera_buffer; // 图像以及边界缓冲区信息 + +seekfree_assistant_transfer_callback_function seekfree_assistant_transfer_callback = seekfree_assistant_transfer; // 数据发送函数指针 +seekfree_assistant_receive_callback_function seekfree_assistant_receive_callback = seekfree_assistant_receive; // 数据接收函数指针 + +seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 +float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 保存接收到的参数 +vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 参数更新标志位 //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手求和函数 @@ -87,7 +109,7 @@ void seekfree_assistant_camera_data_send (seekfree_assistant_image_type_enum cam seekfree_assistant_camera_data.image_height = height; // 首先发送帧头、功能、摄像头类型、以及宽度高度等信息 - seekfree_assistant_transfer((const uint8 *)&seekfree_assistant_camera_data, sizeof(seekfree_assistant_camera_struct)); + seekfree_assistant_transfer_callback((const uint8 *)&seekfree_assistant_camera_data, sizeof(seekfree_assistant_camera_struct)); // 根据摄像头类型计算图像大小 switch(camera_type) @@ -111,9 +133,8 @@ void seekfree_assistant_camera_data_send (seekfree_assistant_image_type_enum cam // 发送图像数据 if(NULL != image_addr) { - seekfree_assistant_transfer(image_addr, image_size); + seekfree_assistant_transfer_callback(image_addr, image_size); } - } //------------------------------------------------------------------------------------------------------------------- @@ -139,16 +160,15 @@ void seekfree_assistant_camera_dot_send (seekfree_assistant_camera_buffer_struct dot_bytes *= 2; } - // 首先发送帧头、功能、边界编号、坐标长度、点个数 - seekfree_assistant_transfer((const uint8 *)&seekfree_assistant_camera_dot_data, sizeof(seekfree_assistant_camera_dot_struct)); + seekfree_assistant_transfer_callback((const uint8 *)&seekfree_assistant_camera_dot_data, sizeof(seekfree_assistant_camera_dot_struct)); for(i=0; i < SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY; i++) { // 判断是否发送横坐标数据 if(NULL != buffer->boundary_x[i]) { - seekfree_assistant_transfer((const uint8 *)buffer->boundary_x[i], dot_bytes); + seekfree_assistant_transfer_callback((const uint8 *)buffer->boundary_x[i], dot_bytes); } // 判断是否发送纵坐标数据 @@ -156,10 +176,9 @@ void seekfree_assistant_camera_dot_send (seekfree_assistant_camera_buffer_struct { // 如果没有纵坐标数据,则表示每一行只有一个边界 // 指定了横纵坐标数据,这种方式可以实现同一行多个边界的情况,例如搜线算法能够搜索出回弯。 - seekfree_assistant_transfer((const uint8 *)buffer->boundary_y[i], dot_bytes); + seekfree_assistant_transfer_callback((const uint8 *)buffer->boundary_y[i], dot_bytes); } } - } //------------------------------------------------------------------------------------------------------------------- @@ -193,7 +212,7 @@ void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struc // 数据在调用本函数之前,由用户将需要发送的数据写入seekfree_assistant_oscilloscope_data.data[] - seekfree_assistant_transfer((const uint8 *)seekfree_assistant_oscilloscope, packet_size); + seekfree_assistant_transfer_callback((const uint8 *)seekfree_assistant_oscilloscope, packet_size); } //------------------------------------------------------------------------------------------------------------------- @@ -364,12 +383,14 @@ void seekfree_assistant_camera_send (void) } } + //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手解析接收到的数据 // 参数说明 void // 返回参数 void // 使用示例 函数只需要放到周期运行的PIT中断或者主循环即可 //------------------------------------------------------------------------------------------------------------------- +#if (1 == SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE) void seekfree_assistant_data_analysis (void) { uint8 temp_sum; @@ -380,14 +401,13 @@ void seekfree_assistant_data_analysis (void) uint32 temp_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE / 4]; // 尝试读取数据, 如果不是自定义的传输方式则从接收回调中读取数据 - read_length = seekfree_assistant_receive((uint8 *)temp_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); + read_length = seekfree_assistant_receive_callback((uint8 *)temp_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); if(read_length) { // 将读取到的数据写入FIFO fifo_write_buffer(&seekfree_assistant_fifo, (uint8 *)temp_buffer, read_length); } - while(sizeof(seekfree_assistant_parameter_struct) <= fifo_used(&seekfree_assistant_fifo)) { read_length = sizeof(seekfree_assistant_parameter_struct); @@ -416,21 +436,11 @@ void seekfree_assistant_data_analysis (void) } } - // 丢弃无需使用的数据 fifo_read_buffer(&seekfree_assistant_fifo, (uint8 *)temp_buffer, &read_length, FIFO_READ_AND_CLEAN); } } - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 逐飞助手 初始化 -// 参数说明 -// 返回参数 void -// 使用示例 -//------------------------------------------------------------------------------------------------------------------- -ZF_WEAK void seekfree_assistant_init () -{ - fifo_init(&seekfree_assistant_fifo, FIFO_DATA_8BIT, seekfree_assistant_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); -} +#endif + diff --git a/Example/E06_exit_demo/libraries/zf_components/seekfree_assistant.h b/Example/E06_exit_demo/libraries/zf_components/seekfree_assistant.h index d02abb1..ae0f67c 100644 --- a/Example/E06_exit_demo/libraries/zf_components/seekfree_assistant.h +++ b/Example/E06_exit_demo/libraries/zf_components/seekfree_assistant.h @@ -1,69 +1,75 @@ -/*/********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +/********************************************************************************************************************* +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ #ifndef _seekfree_assistant_h_ #define _seekfree_assistant_h_ #include "zf_common_typedef.h" -#include "zf_common_debug.h" + + +// 1:使能参数调节的功能 0:关闭参数调节的功能 +#define SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE ( 1 ) + + // 定义接收FIFO大小 -#define SEEKFREE_ASSISTANT_BUFFER_SIZE ( 0x80 ) +#define SEEKFREE_ASSISTANT_BUFFER_SIZE ( 0x80 ) + +// 定义示波器的最大通道数量 +#define SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT ( 0x08 ) + +// 定义参数调试的最大通道数量 +#define SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT ( 0x08 ) + +// 定义图像边线最大数量 +#define SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY ( 0x08 ) + +// 单片机往上位机发送的帧头 +#define SEEKFREE_ASSISTANT_SEND_HEAD ( 0xAA ) + +// 摄像头类 +#define SEEKFREE_ASSISTANT_CAMERA_FUNCTION ( 0x02 ) +#define SEEKFREE_ASSISTANT_CAMERA_DOT_FUNCTION ( 0x03 ) +#define SEEKFREE_ASSISTANT_CAMERA_OSCILLOSCOPE ( 0x10 ) + +// 上位机往单片机发送的帧头 +#define SEEKFREE_ASSISTANT_RECEIVE_HEAD ( 0x55 ) + +// 参数设置类 +#define SEEKFREE_ASSISTANT_RECEIVE_SET_PARAMETER ( 0x20 ) -// 定义示波器的最大通道数量 -#define SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT ( 0x08 ) - -// 定义参数调试的最大通道数量 -#define SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT ( 0x08 ) - -// 定义图像边线最大数量 -#define SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY ( 0x08 ) - -// 单片机往上位机发送的帧头 -#define SEEKFREE_ASSISTANT_SEND_HEAD ( 0xAA ) - -// 摄像头类 -#define SEEKFREE_ASSISTANT_CAMERA_FUNCTION ( 0x02 ) -#define SEEKFREE_ASSISTANT_CAMERA_DOT_FUNCTION ( 0x03 ) -#define SEEKFREE_ASSISTANT_CAMERA_OSCILLOSCOPE ( 0x10 ) - -// 上位机往单片机发送的帧头 -#define SEEKFREE_ASSISTANT_RECEIVE_HEAD ( 0x55 ) - -// 参数设置类 -#define SEEKFREE_ASSISTANT_RECEIVE_SET_PARAMETER ( 0x20 ) // 摄像头类型枚举 typedef enum @@ -91,71 +97,69 @@ typedef enum typedef struct { - uint8 head; // 帧头 - uint8 channel_num; // 高四位为功能字 低四位为通道数量 - uint8 check_sum; // 和校验 - uint8 length; // 包长度 - float data[SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT]; // 通道数据 + uint8 head; // 帧头 + uint8 channel_num; // 高四位为功能字 低四位为通道数量 + uint8 check_sum; // 和校验 + uint8 length; // 包长度 + float data[SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT]; // 通道数据 }seekfree_assistant_oscilloscope_struct; typedef struct { - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 camera_type; // 低四位表示边界数量 第四位表示是否有图像数据 例如0x13:其中3表示一副图像有三条边界(通常是左边界、中线、右边界)、1表示没有图像数据 - uint8 length; // 包长度(仅包含协议部分) - uint16 image_width; // 图像宽度 - uint16 image_height; // 图像高度 -}seekfree_assistant_camera_struct; - - -typedef struct -{ - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 dot_type; // 点类型 BIT5:1:坐标是16位的 0:坐标是8位的 BIT7-BIT6:0:只有X坐标 1:只有Y坐标 2:X和Y坐标都有 BIT3-BIT0:边界数量 - uint8 length; // 包长度(仅包含协议部分) - uint16 dot_num; // 画点数量 - uint8 valid_flag; // 通道标识 - uint8 reserve; // 保留 -}seekfree_assistant_camera_dot_struct; - -typedef struct -{ - void *image_addr; // 摄像头地址 - uint16 width; // 图像宽度 - uint16 height; // 图像高度 - seekfree_assistant_image_type_enum camera_type; // 摄像头类型 - void *boundary_x[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界横坐标数组地址 - void *boundary_y[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界纵坐标数组地址 + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 camera_type; // 低四位表示边界数量 第四位表示是否有图像数据 例如0x13:其中3表示一副图像有三条边界(通常是左边界、中线、右边界)、1表示没有图像数据 + uint8 length; // 包长度(仅包含协议部分) + uint16 image_width; // 图像宽度 + uint16 image_height; // 图像高度 +}seekfree_assistant_camera_struct; + + +typedef struct +{ + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 dot_type; // 点类型 BIT5:1:坐标是16位的 0:坐标是8位的 BIT7-BIT6:0:只有X坐标 1:只有Y坐标 2:X和Y坐标都有 BIT3-BIT0:边界数量 + uint8 length; // 包长度(仅包含协议部分) + uint16 dot_num; // 画点数量 + uint8 valid_flag; // 通道标识 + uint8 reserve; // 保留 +}seekfree_assistant_camera_dot_struct; + +typedef struct +{ + void *image_addr; // 摄像头地址 + uint16 width; // 图像宽度 + uint16 height; // 图像高度 + seekfree_assistant_image_type_enum camera_type; // 摄像头类型 + void *boundary_x[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界横坐标数组地址 + void *boundary_y[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界纵坐标数组地址 }seekfree_assistant_camera_buffer_struct; typedef struct { - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 channel; // 通道 - uint8 check_sum; // 和校验 - float data; // 数据 + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 channel; // 通道 + uint8 check_sum; // 和校验 + float data; // 数据 }seekfree_assistant_parameter_struct; +typedef uint32 (*seekfree_assistant_transfer_callback_function) (const uint8 *buff, uint32 length); +typedef uint32 (*seekfree_assistant_receive_callback_function) (uint8 *buff, uint32 length); -extern seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 -extern float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 保存接收到的参数 -extern vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 参数更新标志位 +extern seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 +extern float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 保存接收到的参数 +extern vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 参数更新标志位 + + +void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struct *seekfree_assistant_oscilloscope); +void seekfree_assistant_camera_information_config (seekfree_assistant_image_type_enum camera_type, void *image_addr, uint16 width, uint16 height); +void seekfree_assistant_camera_boundary_config (seekfree_assistant_boundary_type_enum boundary_type, uint16 dot_num, void *dot_x1, void *dot_x2, void *dot_x3, void *dot_y1, void *dot_y2, void *dot_y3); +void seekfree_assistant_camera_send (void); +void seekfree_assistant_data_analysis (void); -uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length); -uint32 seekfree_assistant_receive (uint8 *buff, uint32 length); - -void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struct *seekfree_assistant_oscilloscope); - -void seekfree_assistant_camera_information_config (seekfree_assistant_image_type_enum camera_type, void *image_addr, uint16 width, uint16 height); -void seekfree_assistant_camera_boundary_config (seekfree_assistant_boundary_type_enum boundary_type, uint16 dot_num, void *dot_x1, void *dot_x2, void *dot_x3, void *dot_y1, void *dot_y2, void *dot_y3); -void seekfree_assistant_camera_send (void); - -void seekfree_assistant_data_analysis (void); -void seekfree_assistant_init (void); #endif diff --git a/Example/E06_exit_demo/libraries/zf_components/seekfree_assistant_interface.c b/Example/E06_exit_demo/libraries/zf_components/seekfree_assistant_interface.c index 99dbeef..fdade63 100644 --- a/Example/E06_exit_demo/libraries/zf_components/seekfree_assistant_interface.c +++ b/Example/E06_exit_demo/libraries/zf_components/seekfree_assistant_interface.c @@ -1,42 +1,55 @@ /********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant_interface * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ #include "zf_common_typedef.h" +#include "zf_common_fifo.h" #include "zf_common_debug.h" +#include "zf_driver_uart.h" +#include "zf_device_wireless_uart.h" +#include "zf_device_bluetooth_ch9141.h" +#include "zf_device_wifi_uart.h" +#include "zf_device_wifi_spi.h" #include "seekfree_assistant.h" +#include "seekfree_assistant_interface.h" + + +extern seekfree_assistant_transfer_callback_function seekfree_assistant_transfer_callback; // 数据发送函数指针 +extern seekfree_assistant_receive_callback_function seekfree_assistant_receive_callback; // 数据接收函数指针 + + //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手发送函数 // 参数说明 *buff 需要发送的数据地址 @@ -46,11 +59,9 @@ //------------------------------------------------------------------------------------------------------------------- ZF_WEAK uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length) { - uint32 len = 0; - - len = debug_send_buffer(buff, length); - - return len; + + // 当选择自定义通讯方式时 需要自行完成数据发送功能 + return length; } //------------------------------------------------------------------------------------------------------------------- @@ -62,11 +73,57 @@ ZF_WEAK uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length) //------------------------------------------------------------------------------------------------------------------- ZF_WEAK uint32 seekfree_assistant_receive (uint8 *buff, uint32 length) { - uint32 len = 0; + // 当选择自定义通讯方式时 需要自行完成数据接收功能 + return 0; +} - len = debug_read_ring_buffer(buff, length); - - return len; +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 逐飞助手接口 初始化 +// 参数说明 +// 返回参数 void +// 使用示例 seekfree_assistant_interface_init(SEEKFREE_ASSISTANT_WIFI_SPI); 使用高速WIFI SPI模块进行数据收发 +// 备注 需要自行调用设备的初始化,例如使用无线转串口进行数据的收发,则需要自行调用无线转串口的初始化,然后再调用seekfree_assistant_interface_init完成逐飞助手的接口初始化 +//------------------------------------------------------------------------------------------------------------------- +ZF_WEAK void seekfree_assistant_interface_init (seekfree_assistant_transfer_device_enum transfer_device) +{ + switch(transfer_device) + { + case SEEKFREE_ASSISTANT_DEBUG_UART: + { + seekfree_assistant_transfer_callback = debug_send_buffer; + seekfree_assistant_receive_callback = debug_read_ring_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIRELESS_UART: + { + seekfree_assistant_transfer_callback = wireless_uart_send_buffer; + seekfree_assistant_receive_callback = wireless_uart_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_CH9141: + { + seekfree_assistant_transfer_callback = bluetooth_ch9141_send_buffer; + seekfree_assistant_receive_callback = bluetooth_ch9141_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIFI_UART: + { + seekfree_assistant_transfer_callback = wifi_uart_send_buffer; + seekfree_assistant_receive_callback = wifi_uart_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIFI_SPI: + { + seekfree_assistant_transfer_callback = wifi_spi_send_buffer; + seekfree_assistant_receive_callback = wifi_spi_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_CUSTOM: + { + // 根据自己的需求 自行实现seekfree_assistant_transfer与seekfree_assistant_receive函数,完成数据的收发 + + }break; + } } diff --git a/Example/E06_exit_demo/libraries/zf_components/seekfree_assistant_interface.h b/Example/E06_exit_demo/libraries/zf_components/seekfree_assistant_interface.h new file mode 100644 index 0000000..940b5f7 --- /dev/null +++ b/Example/E06_exit_demo/libraries/zf_components/seekfree_assistant_interface.h @@ -0,0 +1,57 @@ +/********************************************************************************************************************* +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 +* Copyright (c) 2022 SEEKFREE 逐飞科技 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 +* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 +* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 +* +* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 +* 甚至没有隐含的适销性或适合特定用途的保证 +* 更多细节请参见 GPL +* +* 您应该在收到本开源库的同时收到一份 GPL 的副本 +* 如果没有,请参阅 +* +* 额外注明: +* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 +* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 +* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 +* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) +* +* 文件名称 seekfree_assistant_interface +* 公司名称 成都逐飞科技有限公司 +* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A +* 店铺链接 https://seekfree.taobao.com/ +* +* 修改记录 +* 日期 作者 备注 +* 2024-1-11 SeekFree first version +********************************************************************************************************************/ + +#ifndef _seekfree_assistant_interface_h_ +#define _seekfree_assistant_interface_h_ + + + +// 数据发送设备枚举 +typedef enum +{ + SEEKFREE_ASSISTANT_DEBUG_UART, // 调试串口 使用的串口由DEBUG_UART_INDEX宏定义指定 + SEEKFREE_ASSISTANT_WIRELESS_UART, // 无线转串口 + SEEKFREE_ASSISTANT_CH9141, // CH9141蓝牙 + SEEKFREE_ASSISTANT_WIFI_UART, // WIFI转串口 + SEEKFREE_ASSISTANT_WIFI_SPI, // 高速WIFI SPI + SEEKFREE_ASSISTANT_CUSTOM, // 自定义通讯方式 需要自行seekfree_assistant_transfer与seekfree_assistant_receive函数 +}seekfree_assistant_transfer_device_enum; + + +void seekfree_assistant_interface_init (seekfree_assistant_transfer_device_enum transfer_device); + + + +#endif diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_absolute_encoder.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_absolute_encoder.c index 7c80a3b..f9bc809 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_absolute_encoder.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_absolute_encoder.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_absolute_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_absolute_encoder.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_absolute_encoder.h index e6cc057..ed92906 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_absolute_encoder.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_absolute_encoder.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_absolute_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c index 500bccb..b0a06df 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_bluetooth_ch9141 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -54,7 +54,7 @@ #include "zf_device_camera.h" #include "zf_device_bluetooth_ch9141.h" -static fifo_obj_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 +static fifo_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 static uint8 bluetooth_ch9141_buffer[BLUETOOTH_CH9141_BUFFER_SIZE]; // 数据存放数组 static uint8 bluetooth_ch9141_data = 0; // 数据临时存放变量 diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h index 800be6c..ffb30b5 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h @@ -24,7 +24,7 @@ * 文件名称 main * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_camera.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_camera.c index 84c7aa0..68668c4 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_camera.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_camera.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_camera * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -45,7 +45,7 @@ #include "zf_device_camera.h" -fifo_obj_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 +fifo_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; // 定义摄像头接收数据缓冲区 uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // 定义摄像头数据发送到上位机的帧头 diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_camera.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_camera.h index 58efb06..2cd7d2d 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_camera.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_camera.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_camera * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -44,7 +44,7 @@ //=================================================摄像头公共库 基本配置================================================ #define CAMERA_RECEIVER_BUFFER_SIZE (8) // 定义摄像头接收数据缓冲区大小 -extern fifo_obj_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 +extern fifo_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 extern uint8 camera_send_image_frame_header[4]; // 声明摄像头数据发送到上位机的帧头 //=================================================摄像头公共库 基本配置================================================ diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_config.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_config.h index af6a3d8..6c8147d 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_config.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_config.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_config * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_dl1a.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_dl1a.c index 3e7410c..27be3a7 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_dl1a.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_dl1a.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1a * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_dl1a.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_dl1a.h index 89145d3..3176dd3 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_dl1a.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_dl1a.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1a * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_dl1b.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_dl1b.c index 90e64b3..96e472e 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_dl1b.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_dl1b.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1b * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_dl1b.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_dl1b.h index b144739..922b3ce 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_dl1b.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_dl1b.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1b * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_gnss.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_gnss.c new file mode 100644 index 0000000..caf7cd0 --- /dev/null +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_gnss.c @@ -0,0 +1,620 @@ +/********************************************************************************************************************* +* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* Copyright (c) 2022 SEEKFREE 逐飞科技 +* +* 本文件是 TC264 开源库的一部分 +* +* TC264 开源库 是免费软件 +* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 +* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 +* +* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 +* 甚至没有隐含的适销性或适合特定用途的保证 +* 更多细节请参见 GPL +* +* 您应该在收到本开源库的同时收到一份 GPL 的副本 +* 如果没有,请参阅 +* +* 额外注明: +* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 +* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 +* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 +* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) +* +* 文件名称 zf_device_gnss +* 公司名称 成都逐飞科技有限公司 +* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 +* 开发环境 ADS v1.9.20 +* 适用平台 TC264D +* 店铺链接 https://seekfree.taobao.com/ +* +* 修改记录 +* 日期 作者 备注 +* 2023-12-28 pudding first version +********************************************************************************************************************/ +/********************************************************************************************************************* +* 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* RX 查看 zf_device_gnss.h 中 GNSS_RX 宏定义 +* TX 查看 zf_device_gnss.h 中 GNSS_TX 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* ------------------------------------ +********************************************************************************************************************/ + +#include "math.h" +#include "zf_common_function.h" +#include "zf_common_fifo.h" +#include "zf_driver_delay.h" +#include "zf_driver_uart.h" + +#include "zf_device_gnss.h" + +#define GNSS_BUFFER_SIZE ( 128 ) + +uint8 gnss_flag = 0; // 1:采集完成等待处理数据 0:没有采集完成 +gnss_info_struct gnss; // GPS解析之后的数据 + +static uint8 gnss_state = 0; // 1:GPS初始化完成 +static fifo_struct gnss_receiver_fifo; // +static uint8 gnss_receiver_buffer[GNSS_BUFFER_SIZE]; // 数据存放数组 + +static gps_state_enum gnss_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 +static gps_state_enum gnss_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 +static gps_state_enum gnss_ths_state = GPS_STATE_RECEIVING; // rmc 语句状态 + +static uint8 gps_gga_buffer[GNSS_BUFFER_SIZE]; +static uint8 gps_rmc_buffer[GNSS_BUFFER_SIZE]; +static uint8 gps_ths_buffer[GNSS_BUFFER_SIZE]; + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 获取指定 ',' 后面的索引 +// 参数说明 num 第几个逗号 +// 参数说明 *str 字符串 +// 返回参数 uint8 返回索引 +// 使用示例 get_parameter_index(1, s); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 get_parameter_index (uint8 num, char *str) +{ + uint8 i = 0, j = 0; + char *temp = strchr(str, '\n'); + uint8 len = 0, len1 = 0; + + 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; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 给定字符串第一个 ',' 之前的数据转换为int +// 参数说明 *s 字符串 +// 返回参数 float 返回数值 +// 使用示例 get_int_number(&buf[get_parameter_index(7, buf)]); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static int get_int_number (char *s) +{ + char buf[10]; + uint8 i = 0; + int return_value = 0; + i = get_parameter_index(1, s); + i = i - 1; + strncpy(buf, s, i); + buf[i] = 0; + return_value = func_str_to_int(buf); + return return_value; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 给定字符串第一个 ',' 之前的数据转换为float +// 参数说明 *s 字符串 +// 返回参数 float 返回数值 +// 使用示例 get_float_number(&buf[get_parameter_index(8, buf)]); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static float get_float_number (char *s) +{ + uint8 i = 0; + char buf[15]; + float return_value = 0; + + i = get_parameter_index(1, s); + i = i - 1; + strncpy(buf, s, i); + buf[i] = 0; + return_value = (float)func_str_to_double(buf); + return return_value; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 给定字符串第一个 ',' 之前的数据转换为double +// 参数说明 *s 字符串 +// 返回参数 double 返回数值 +// 使用示例 get_double_number(&buf[get_parameter_index(3, buf)]); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static double get_double_number (char *s) +{ + uint8 i = 0; + char buf[15]; + double return_value = 0; + + i = get_parameter_index(1, s); + i = i - 1; + strncpy(buf, s, i); + buf[i] = 0; + return_value = func_str_to_double(buf); + return return_value; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 世界时间转换为北京时间 +// 参数说明 *time 保存的时间 +// 返回参数 void +// 使用示例 utc_to_btc(&gnss->time); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static void utc_to_btc (gps_time_struct *time) +{ + uint8 day_num = 0; + + time->hour = time->hour + 8; + if(23 < time->hour) + { + time->hour -= 24; + time->day += 1; + + if(2 == time->month) + { + day_num = 28; + if((0 == time->year % 4 && 0 != time->year % 100) || 0 == time->year % 400) // 判断是否为闰年 + { + day_num ++; // 闰月 2月为29天 + } + } + else + { + day_num = 31; // 1 3 5 7 8 10 12这些月份为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(12 < time->month) + { + time->month -= 12; + time->year ++; + } + } + } +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 RMC语句解析 +// 参数说明 *line 接收到的语句信息 +// 参数说明 *gnss 保存解析后的数据 +// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 +// 使用示例 gps_gnrmc_parse((char *)data_buffer, &gnss); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 gps_gnrmc_parse (char *line, gnss_info_struct *gnss) +{ + uint8 state = 0, temp = 0; + + double latitude = 0; // 纬度 + double longitude = 0; // 经度 + + double lati_cent_tmp = 0, lati_second_tmp = 0; + double long_cent_tmp = 0, long_second_tmp = 0; + float speed_tmp = 0; + char *buf = line; + uint8 return_state = 0; + + state = buf[get_parameter_index(2, buf)]; + + if('A' == state) // 如果数据有效 则解析数据 + { + return_state = 1; + gnss->state = 1; + gnss -> ns = buf[get_parameter_index(4, buf)]; + gnss -> 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)]); + + gnss->latitude_degree = (int)latitude / 100; // 纬度转换为度分秒 + lati_cent_tmp = (latitude - gnss->latitude_degree * 100); + gnss->latitude_cent = (int)lati_cent_tmp; + lati_second_tmp = (lati_cent_tmp - gnss->latitude_cent) * 6000; + gnss->latitude_second = (int)lati_second_tmp; + + gnss->longitude_degree = (int)longitude / 100; // 经度转换为度分秒 + long_cent_tmp = (longitude - gnss->longitude_degree * 100); + gnss->longitude_cent = (int)long_cent_tmp; + long_second_tmp = (long_cent_tmp - gnss->longitude_cent) * 6000; + gnss->longitude_second = (int)long_second_tmp; + + gnss->latitude = gnss->latitude_degree + lati_cent_tmp / 60; + gnss->longitude = gnss->longitude_degree + long_cent_tmp / 60; + + speed_tmp = get_float_number(&buf[get_parameter_index(7, buf)]); // 速度(海里/小时) + gnss->speed = speed_tmp * 1.85f; // 转换为公里/小时 + gnss->direction = get_float_number(&buf[get_parameter_index(8, buf)]); // 角度 + } + else + { + gnss->state = 0; + } + + // 在定位没有生效前也是有时间数据的,可以直接解析 + gnss->time.hour = (buf[7] - '0') * 10 + (buf[8] - '0'); // 时间 + gnss->time.minute = (buf[9] - '0') * 10 + (buf[10] - '0'); + gnss->time.second = (buf[11] - '0') * 10 + (buf[12] - '0'); + temp = get_parameter_index(9, buf); + gnss->time.day = (buf[temp + 0] - '0') * 10 + (buf[temp + 1] - '0'); // 日期 + gnss->time.month = (buf[temp + 2] - '0') * 10 + (buf[temp + 3] - '0'); + gnss->time.year = (buf[temp + 4] - '0') * 10 + (buf[temp + 5] - '0') + 2000; + + utc_to_btc(&gnss->time); + + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 GGA语句解析 +// 参数说明 *line 接收到的语句信息 +// 参数说明 *gnss 保存解析后的数据 +// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 +// 使用示例 gps_gngga_parse((char *)data_buffer, &gnss); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 gps_gngga_parse (char *line, gnss_info_struct *gnss) +{ + uint8 state = 0; + char *buf = line; + uint8 return_state = 0; + + state = buf[get_parameter_index(2, buf)]; + + if(',' != state) + { + gnss->satellite_used = (uint8)get_int_number(&buf[get_parameter_index(7, buf)]); + gnss->height = get_float_number(&buf[get_parameter_index(9, buf)]) + get_float_number(&buf[get_parameter_index(11, buf)]); // 高度 = 海拔高度 + 地球椭球面相对大地水准面的高度 + return_state = 1; + } + + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 THS语句解析 +// 参数说明 *line 接收到的语句信息 +// 参数说明 *gnss 保存解析后的数据 +// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 +// 使用示例 gps_gnths_parse((char *)data_buffer, &gnss); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 gps_gnths_parse (char *line, gnss_info_struct *gnss) +{ + uint8 state = 0; + char *buf = line; + uint8 return_state = 0; + + state = buf[get_parameter_index(2, buf)]; + + if('A' == state) + { + gnss->antenna_direction_state = 1; + gnss->antenna_direction = get_float_number(&buf[get_parameter_index(1, buf)]); + return_state = 1; + } + else + { + gnss->antenna_direction_state = 0; + } + + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 计算从第一个点到第二个点的距离 +// 参数说明 latitude1 第一个点的纬度 +// 参数说明 longitude1 第一个点的经度 +// 参数说明 latitude2 第二个点的纬度 +// 参数说明 longitude2 第二个点的经度 +// 返回参数 double 返回两点距离 +// 使用示例 get_two_points_distance(latitude1_1, longitude1, latitude2, longitude2); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +double get_two_points_distance (double latitude1, double longitude1, double latitude2, double longitude2) +{ + const double EARTH_RADIUS = 6378137; // 地球半径(单位:m) + double rad_latitude1 = 0; + double rad_latitude2 = 0; + double rad_longitude1 = 0; + double rad_longitude2 = 0; + double distance = 0; + double a = 0; + double b = 0; + + rad_latitude1 = ANGLE_TO_RAD(latitude1); // 根据角度计算弧度 + 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 里面实现的算法 + distance = distance * EARTH_RADIUS; + + return distance; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 计算从第一个点到第二个点的方位角 +// 参数说明 latitude1 第一个点的纬度 +// 参数说明 longitude1 第一个点的经度 +// 参数说明 latitude2 第二个点的纬度 +// 参数说明 longitude2 第二个点的经度 +// 返回参数 double 返回方位角(0至360) +// 使用示例 get_two_points_azimuth(latitude1_1, longitude1, latitude2, longitude2); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +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 ((0 < angle) ? angle : (angle + 360)); +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 解析GPS数据 +// 参数说明 void +// 返回参数 uint8 0-解析成功 1-解析失败 可能数据包错误 +// 使用示例 gps_data_parse(); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +uint8 gnss_data_parse (void) +{ + uint8 return_state = 0; + uint8 check_buffer[5] = {'0', 'x', 0x00, 0x00, 0x00}; + uint8 bbc_xor_origin = 0; + uint8 bbc_xor_calculation = 0; + uint32 data_len = 0; + + do + { + if(GPS_STATE_RECEIVED == gnss_rmc_state) + { + gnss_rmc_state = GPS_STATE_PARSING; + strncpy((char *)&check_buffer[2], strchr((const char *)gps_rmc_buffer, '*') + 1, 2); + bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); + for(bbc_xor_calculation = gps_rmc_buffer[1], data_len = 2; '*' != gps_rmc_buffer[data_len]; data_len ++) + { + bbc_xor_calculation ^= gps_rmc_buffer[data_len]; + } + if(bbc_xor_calculation != bbc_xor_origin) + { + // 数据校验失败 + return_state = 1; + break; + } + + gps_gnrmc_parse((char *)gps_rmc_buffer, &gnss); + } + gnss_rmc_state = GPS_STATE_RECEIVING; + + if(GPS_STATE_RECEIVED == gnss_gga_state) + { + gnss_gga_state = GPS_STATE_PARSING; + strncpy((char *)&check_buffer[2], strchr((const char *)gps_gga_buffer, '*') + 1, 2); + bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); + + for(bbc_xor_calculation = gps_gga_buffer[1], data_len = 2; '*' != gps_gga_buffer[data_len]; data_len ++) + { + bbc_xor_calculation ^= gps_gga_buffer[data_len]; + } + if(bbc_xor_calculation != bbc_xor_origin) + { + // 数据校验失败 + return_state = 1; + break; + } + + gps_gngga_parse((char *)gps_gga_buffer, &gnss); + } + gnss_gga_state = GPS_STATE_RECEIVING; + + if(GPS_STATE_RECEIVED == gnss_ths_state) + { + gnss_ths_state = GPS_STATE_PARSING; + strncpy((char *)&check_buffer[2], strchr((const char *)gps_ths_buffer, '*') + 1, 2); + bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); + + for(bbc_xor_calculation = gps_ths_buffer[1], data_len = 2; '*' != gps_ths_buffer[data_len]; data_len ++) + { + bbc_xor_calculation ^= gps_ths_buffer[data_len]; + } + if(bbc_xor_calculation != bbc_xor_origin) + { + // 数据校验失败 + return_state = 1; + break; + } + + gps_gnths_parse((char *)gps_ths_buffer, &gnss); + } + gnss_ths_state = GPS_STATE_RECEIVING; + + }while(0); + return return_state; +} + + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 GPS串口回调函数 +// 参数说明 void +// 返回参数 void +// 使用示例 gps_uart_callback(); +// 备注信息 此函数需要在串口接收中断内进行调用 +//------------------------------------------------------------------------------------------------------------------- +void gnss_uart_callback (void) +{ + uint8 temp_gps[6]; + uint32 temp_length = 0; + + + + + if(gnss_state) + { + uint8 dat; + while(uart_query_byte(GNSS_UART, &dat)) + { + fifo_write_buffer(&gnss_receiver_fifo, &dat, 1); + } + + if('\n' == dat) + { + // 读取前6个数据 用于判断语句类型 + temp_length = 6; + fifo_read_buffer(&gnss_receiver_fifo, temp_gps, &temp_length, FIFO_READ_ONLY); + + // 根据不同类型将数据拷贝到不同的缓冲区 + if(0 == strncmp((char *)&temp_gps[3], "RMC", 3)) + { + // 如果没有在解析数据则更新缓冲区的数据 + if(GPS_STATE_PARSING != gnss_rmc_state) + { + gnss_rmc_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_rmc_buffer, &temp_length, FIFO_READ_AND_CLEAN); + } + } + else if(0 == strncmp((char *)&temp_gps[3], "GGA", 3)) + { + // 如果没有在解析数据则更新缓冲区的数据 + if(GPS_STATE_PARSING != gnss_gga_state) + { + gnss_gga_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_gga_buffer, &temp_length, FIFO_READ_AND_CLEAN); + } + } + else if(0 == strncmp((char *)&temp_gps[3], "THS", 3)) + { + // 如果没有在解析数据则更新缓冲区的数据 + if(GPS_STATE_PARSING != gnss_ths_state) + { + gnss_ths_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_ths_buffer, &temp_length, FIFO_READ_AND_CLEAN); + } + } + + // 统一将FIFO清空 + fifo_clear(&gnss_receiver_fifo); + + gnss_flag = 1; + } + } +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 GPS初始化 +// 参数说明 void +// 返回参数 void +// 使用示例 gps_init(); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +void gnss_init (gps_device_enum gps_device) +{ + 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}; + + if((TAU1201 == gps_device) || (GN42A == gps_device)) + { + fifo_init(&gnss_receiver_fifo, FIFO_DATA_8BIT, gnss_receiver_buffer, GNSS_BUFFER_SIZE); + system_delay_ms(500); // 等待GPS启动后开始初始化 + uart_init(GNSS_UART, 115200, GNSS_RX, GNSS_TX); + + uart_write_buffer(GNSS_UART, (uint8 *)set_rate, sizeof(set_rate)); // 设置GPS更新速率为10hz 如果不调用此语句则默认为1hz + system_delay_ms(200); + + uart_write_buffer(GNSS_UART, (uint8 *)open_rmc, sizeof(open_rmc)); // 开启rmc语句 + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)open_gga, sizeof(open_gga)); // 开启gga语句 + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gll, sizeof(close_gll)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gsa, sizeof(close_gsa)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_grs, sizeof(close_grs)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gsv, sizeof(close_gsv)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_vtg, sizeof(close_vtg)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_zda, sizeof(close_zda)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gst, sizeof(close_gst)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_txt, sizeof(close_txt)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_txt_ant, sizeof(close_txt_ant)); + system_delay_ms(50); + + gnss_state = 1; + uart_rx_interrupt(GNSS_UART, 1); + } + else if(GN43RFA == gps_device) + { + // GN43RFA RTK模块不需要进行参数设置,如果需要修改参数应该使用专用的上位机修改参数 + fifo_init(&gnss_receiver_fifo, FIFO_DATA_8BIT, gnss_receiver_buffer, GNSS_BUFFER_SIZE); + uart_init(GNSS_UART, 115200, GNSS_RX, GNSS_TX); + gnss_state = 1; + uart_rx_interrupt(GNSS_UART, 1); + } + +} diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_gnss.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_gnss.h new file mode 100644 index 0000000..5d58976 --- /dev/null +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_gnss.h @@ -0,0 +1,125 @@ +/********************************************************************************************************************* +* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* Copyright (c) 2022 SEEKFREE 逐飞科技 +* +* 本文件是 TC264 开源库的一部分 +* +* TC264 开源库 是免费软件 +* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 +* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 +* +* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 +* 甚至没有隐含的适销性或适合特定用途的保证 +* 更多细节请参见 GPL +* +* 您应该在收到本开源库的同时收到一份 GPL 的副本 +* 如果没有,请参阅 +* +* 额外注明: +* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 +* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 +* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 +* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) +* +* 文件名称 zf_device_gnss +* 公司名称 成都逐飞科技有限公司 +* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 +* 开发环境 ADS v1.9.20 +* 适用平台 TC264D +* 店铺链接 https://seekfree.taobao.com/ +* +* 修改记录 +* 日期 作者 备注 +* 2023-12-28 pudding first version +********************************************************************************************************************/ +/********************************************************************************************************************* +* 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* RX 查看 zf_device_gnss.h 中 GNSS_RX 宏定义 +* TX 查看 zf_device_gnss.h 中 GNSS_TX 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* ------------------------------------ +********************************************************************************************************************/ + +#ifndef _zf_device_gnss_h_ +#define _zf_device_gnss_h_ + +#include "zf_common_typedef.h" + +//-------------------------------------------------------------------------------------------------- +//引脚配置 +//-------------------------------------------------------------------------------------------------- +#define GNSS_UART (UART_3) +#define GNSS_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 +#define GNSS_TX (UART3_RX_P15_7) // GPS TX串口引脚 + +#define ANGLE_TO_RAD(x) ( (x) * PI / 180.0 ) // 角度转换为弧度 +#define RAD_TO_ANGLE(x) ( (x) * 180.0 / PI ) // 弧度转换为角度 +#define PI ( 3.1415926535898 ) + +typedef enum +{ + TAU1201 = 1, // 逐飞科技双频GPS模块 + GN42A = 1, // 逐飞科技双频GPS模块 与TAU1201是一样的 + GN43RFA = 2, // 逐飞科技三频RTK模块 +}gps_device_enum; + +typedef struct +{ + uint16 year; + uint8 month; + uint8 day; + uint8 hour; + uint8 minute; + uint8 second; +}gps_time_struct; + +typedef struct +{ + gps_time_struct time; // 时间 + + uint8 state; // 有效状态 1:定位有效 0:定位无效 + + uint16 latitude_degree; // 度 + uint16 latitude_cent; // 分 + uint16 latitude_second; // 秒 这里的秒是被放大了100倍的,主要是避免使用浮点数 + uint16 longitude_degree; // 度 + uint16 longitude_cent; // 分 + uint16 longitude_second; // 秒 这里的秒是被放大了100倍的,主要是避免使用浮点数 + + double latitude; // 纬度 + double longitude; // 经度 + + int8 ns; // 纬度半球 N(北半球)或 S(南半球) + int8 ew; // 经度半球 E(东经)或 W(西经) + + float speed; // 速度(公里/每小时) + float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准)+ + uint8 antenna_direction_state; // 双天线测向有效状态 1:测向有效 0:测向无效,无效时antenna_direction数据是无效的 + float antenna_direction; // 主天线指向从天线与真北构成的夹角(000.0~359.9 度) + + // 下面两个个信息从GNGGA语句中获取 + uint8 satellite_used; // 用于定位的卫星数量 + float height; // 高度 +}gnss_info_struct; + +typedef enum +{ + GPS_STATE_RECEIVING, // 正在接收数据 + GPS_STATE_RECEIVED, // 数据接收完成 + GPS_STATE_PARSING, // 正在解析 +}gps_state_enum; + +extern gnss_info_struct gnss; +extern uint8 gnss_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); +uint8 gnss_data_parse (void); +void gnss_uart_callback (void); +void gnss_init (gps_device_enum gps_device); + +#endif diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_gps_tau1201.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_gps_tau1201.c deleted file mode 100644 index da46a99..0000000 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_gps_tau1201.c +++ /dev/null @@ -1,541 +0,0 @@ -/********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 -* Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 -* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 -* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* -* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 -* 甚至没有隐含的适销性或适合特定用途的保证 -* 更多细节请参见 GPL -* -* 您应该在收到本开源库的同时收到一份 GPL 的副本 -* 如果没有,请参阅 -* -* 额外注明: -* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 -* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 -* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 -* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* -* 文件名称 zf_device_gps_tau1201 -* 公司名称 成都逐飞科技有限公司 -* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D -* 店铺链接 https://seekfree.taobao.com/ -* -* 修改记录 -* 日期 作者 备注 -* 2022-09-15 pudding first version -* 2023-04-28 pudding 增加中文注释说明 -********************************************************************************************************************/ -/******************************************************************************************************************** -* 接线定义: -* ------------------------------------ -* 模块管脚 单片机管脚 -* RX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_RX 宏定义 -* TX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_TX 宏定义 -* VCC 3.3V电源 -* GND 电源地 -* ------------------------------------ -********************************************************************************************************************/ - -#include "math.h" -#include "zf_common_function.h" -#include "zf_common_fifo.h" -#include "zf_driver_delay.h" -#include "zf_driver_uart.h" - -#include "zf_device_gps_tau1201.h" - -#define GPS_TAU1201_BUFFER_SIZE ( 128 ) - -uint8 gps_tau1201_flag = 0; // 1:采集完成等待处理数据 0:没有采集完成 -gps_info_struct gps_tau1201; // GPS解析之后的数据 - -static uint8 gps_tau1201_state = 0; // 1:GPS初始化完成 -static fifo_obj_struct gps_tau1201_receiver_fifo; // -static uint8 gps_tau1201_receiver_buffer[GPS_TAU1201_BUFFER_SIZE]; // 数据存放数组 - -gps_state_enum gps_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 -gps_state_enum gps_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 - -static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; // GGA语句缓冲区 -static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; // RMC语句缓冲区 - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 获取指定 ',' 后面的索引 -// 参数说明 num 第几个逗号 -// 参数说明 *str 字符串 -// 返回参数 uint8 返回索引 -// 使用示例 get_parameter_index(1, s); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static uint8 get_parameter_index (uint8 num, char *str) -{ - uint8 i = 0, j = 0; - char *temp = strchr(str, '\n'); - uint8 len = 0, len1 = 0; - - 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; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 给定字符串第一个 ',' 之前的数据转换为int -// 参数说明 *s 字符串 -// 返回参数 float 返回数值 -// 使用示例 get_int_number(&buf[get_parameter_index(7, buf)]); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static int get_int_number (char *s) -{ - char buf[10]; - uint8 i = 0; - int return_value = 0; - i = get_parameter_index(1, s); - i = i - 1; - strncpy(buf, s, i); - buf[i] = 0; - return_value = func_str_to_int(buf); - return return_value; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 给定字符串第一个 ',' 之前的数据转换为float -// 参数说明 *s 字符串 -// 返回参数 float 返回数值 -// 使用示例 get_float_number(&buf[get_parameter_index(8, buf)]); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static float get_float_number (char *s) -{ - uint8 i = 0; - char buf[15]; - float return_value = 0; - - i = get_parameter_index(1, s); - i = i - 1; - strncpy(buf, s, i); - buf[i] = 0; - return_value = (float)func_str_to_double(buf); - return return_value; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 给定字符串第一个 ',' 之前的数据转换为double -// 参数说明 *s 字符串 -// 返回参数 double 返回数值 -// 使用示例 get_double_number(&buf[get_parameter_index(3, buf)]); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static double get_double_number (char *s) -{ - uint8 i = 0; - char buf[15]; - double return_value = 0; - - i = get_parameter_index(1, s); - i = i - 1; - strncpy(buf, s, i); - buf[i] = 0; - return_value = func_str_to_double(buf); - return return_value; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 世界时间转换为北京时间 -// 参数说明 *time 保存的时间 -// 返回参数 void -// 使用示例 utc_to_btc(&gps->time); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static void utc_to_btc (gps_time_struct *time) -{ - uint8 day_num = 0; - - time->hour = time->hour + 8; - if(23 < time->hour) - { - time->hour -= 24; - time->day += 1; - - if(2 == time->month) - { - day_num = 28; - if((0 == time->year % 4 && 0 != time->year % 100) || 0 == time->year % 400) // 判断是否为闰年 - { - day_num ++; // 闰月 2月为29天 - } - } - else - { - day_num = 31; // 1 3 5 7 8 10 12这些月份为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(12 < time->month) - { - time->month -= 12; - time->year ++; - } - } - } -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 RMC语句解析 -// 参数说明 *line 接收到的语句信息 -// 参数说明 *gps 保存解析后的数据 -// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 -// 使用示例 gps_gnrmc_parse((char *)data_buffer, &gps_tau1201); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static uint8 gps_gnrmc_parse (char *line, gps_info_struct *gps) -{ - uint8 state = 0, temp = 0; - - double latitude = 0; // 纬度 - double longitude = 0; // 经度 - - double lati_cent_tmp = 0, lati_second_tmp = 0; - double long_cent_tmp = 0, long_second_tmp = 0; - float speed_tmp = 0; - char *buf = line; - uint8 return_state = 0; - - state = buf[get_parameter_index(2, buf)]; - - gps->state = 0; - if('A' == state) // 如果数据有效 则解析数据 - { - return_state = 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; // 纬度转换为度分秒 - lati_cent_tmp = (latitude - gps->latitude_degree * 100); - gps->latitude_cent = (int)lati_cent_tmp; - lati_second_tmp = (lati_cent_tmp - gps->latitude_cent) * 6000; - gps->latitude_second = (int)lati_second_tmp; - - gps->longitude_degree = (int)longitude / 100; // 经度转换为度分秒 - long_cent_tmp = (longitude - gps->longitude_degree * 100); - gps->longitude_cent = (int)long_cent_tmp; - long_second_tmp = (long_cent_tmp - gps->longitude_cent) * 6000; - gps->longitude_second = (int)long_second_tmp; - - gps->latitude = gps->latitude_degree + lati_cent_tmp / 60; - gps->longitude = gps->longitude_degree + long_cent_tmp / 60; - - speed_tmp = get_float_number(&buf[get_parameter_index(7, buf)]); // 速度(海里/小时) - gps->speed = speed_tmp * 1.85f; // 转换为公里/小时 - gps->direction = get_float_number(&buf[get_parameter_index(8, buf)]); // 角度 - } - - // 在定位没有生效前也是有时间数据的,可以直接解析 - gps->time.hour = (buf[7] - '0') * 10 + (buf[8] - '0'); // 时间 - 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'); // 日期 - 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_state; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 GGA语句解析 -// 参数说明 *line 接收到的语句信息 -// 参数说明 *gps 保存解析后的数据 -// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 -// 使用示例 gps_gngga_parse((char *)data_buffer, &gps_tau1201); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static uint8 gps_gngga_parse (char *line, gps_info_struct *gps) -{ - uint8 state = 0; - char *buf = line; - uint8 return_state = 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)]); // 高度 = 海拔高度 + 地球椭球面相对大地水准面的高度 - return_state = 1; - } - - return return_state; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 计算从第一个点到第二个点的距离 -// 参数说明 latitude1 第一个点的纬度 -// 参数说明 longitude1 第一个点的经度 -// 参数说明 latitude2 第二个点的纬度 -// 参数说明 longitude2 第二个点的经度 -// 返回参数 double 返回两点距离 -// 使用示例 get_two_points_distance(latitude1_1, longitude1, latitude2, longitude2); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -double get_two_points_distance (double latitude1, double longitude1, double latitude2, double longitude2) -{ - const double EARTH_RADIUS = 6378137; // 地球半径(单位:m) - double rad_latitude1 = 0; - double rad_latitude2 = 0; - double rad_longitude1 = 0; - double rad_longitude2 = 0; - double distance = 0; - double a = 0; - double b = 0; - - rad_latitude1 = ANGLE_TO_RAD(latitude1); // 根据角度计算弧度 - 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 里面实现的算法 - distance = distance * EARTH_RADIUS; - - return distance; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 计算从第一个点到第二个点的方位角 -// 参数说明 latitude1 第一个点的纬度 -// 参数说明 longitude1 第一个点的经度 -// 参数说明 latitude2 第二个点的纬度 -// 参数说明 longitude2 第二个点的经度 -// 返回参数 double 返回方位角(0至360) -// 使用示例 get_two_points_azimuth(latitude1_1, longitude1, latitude2, longitude2); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -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 ((0 < angle) ? angle : (angle + 360)); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 解析GPS数据 -// 参数说明 void -// 返回参数 uint8 0-解析成功 1-解析失败 可能数据包错误 -// 使用示例 gps_data_parse(); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -uint8 gps_data_parse (void) -{ - uint8 return_state = 0; - uint8 check_buffer[5] = {'0', 'x', 0x00, 0x00, 0x00}; - uint8 bbc_xor_origin = 0; - uint8 bbc_xor_calculation = 0; - uint32 data_len = 0; - - do - { - if(GPS_STATE_RECEIVED == gps_rmc_state) - { - gps_rmc_state = GPS_STATE_PARSING; - strncpy((char *)&check_buffer[2], strchr((const char *)gps_rmc_buffer, '*') + 1, 2); - bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); - for(bbc_xor_calculation = gps_rmc_buffer[1], data_len = 2; '*' != gps_rmc_buffer[data_len]; data_len ++) - { - bbc_xor_calculation ^= gps_rmc_buffer[data_len]; - } - if(bbc_xor_calculation != bbc_xor_origin) - { - // 数据校验失败 - return_state = 1; - break; - } - - gps_gnrmc_parse((char *)gps_rmc_buffer, &gps_tau1201); - } - gps_rmc_state = GPS_STATE_RECEIVING; - - if(GPS_STATE_RECEIVED == gps_gga_state) - { - gps_gga_state = GPS_STATE_PARSING; - strncpy((char *)&check_buffer[2], strchr((const char *)gps_gga_buffer, '*') + 1, 2); - bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); - - for(bbc_xor_calculation = gps_gga_buffer[1], data_len = 2; '*' != gps_gga_buffer[data_len]; data_len ++) - { - bbc_xor_calculation ^= gps_gga_buffer[data_len]; - } - if(bbc_xor_calculation != bbc_xor_origin) - { - // 数据校验失败 - return_state = 1; - break; - } - - gps_gngga_parse((char *)gps_gga_buffer, &gps_tau1201); - } - gps_gga_state = GPS_STATE_RECEIVING; - - }while(0); - return return_state; -} - - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 GPS串口回调函数 -// 参数说明 void -// 返回参数 void -// 使用示例 gps_uart_callback(); -// 备注信息 此函数需要在串口接收中断内进行调用 -//------------------------------------------------------------------------------------------------------------------- -void gps_uart_callback (void) -{ - uint8 temp_gps[6]; - uint32 temp_length = 0; - - if(gps_tau1201_state) - { - uint8 dat; - while(uart_query_byte(GPS_TAU1201_UART, &dat)) - { - fifo_write_buffer(&gps_tau1201_receiver_fifo, &dat, 1); - } - - if('\n' == dat) - { - // 读取前6个数据 用于判断语句类型 - temp_length = 6; - fifo_read_buffer(&gps_tau1201_receiver_fifo, temp_gps, &temp_length, FIFO_READ_ONLY); - - // 根据不同类型将数据拷贝到不同的缓冲区 - if(0 == strncmp((char *)&temp_gps[3], "RMC", 3)) - { - // 如果没有在解析数据则更新缓冲区的数据 - if(GPS_STATE_PARSING != gps_rmc_state) - { - gps_rmc_state = GPS_STATE_RECEIVED; - temp_length = fifo_used(&gps_tau1201_receiver_fifo); - fifo_read_buffer(&gps_tau1201_receiver_fifo, gps_rmc_buffer, &temp_length, FIFO_READ_AND_CLEAN); - } - } - else if(0 == strncmp((char *)&temp_gps[3], "GGA", 3)) - { - // 如果没有在解析数据则更新缓冲区的数据 - if(GPS_STATE_PARSING != gps_gga_state) - { - gps_gga_state = GPS_STATE_RECEIVED; - temp_length = fifo_used(&gps_tau1201_receiver_fifo); - fifo_read_buffer(&gps_tau1201_receiver_fifo, gps_gga_buffer, &temp_length, FIFO_READ_AND_CLEAN); - } - } - - // 统一将FIFO清空 - fifo_clear(&gps_tau1201_receiver_fifo); - - gps_tau1201_flag = 1; - } - } -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 GPS初始化 -// 参数说明 void -// 返回参数 void -// 使用示例 gps_init(); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -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}; - - fifo_init(&gps_tau1201_receiver_fifo, FIFO_DATA_8BIT, gps_tau1201_receiver_buffer, GPS_TAU1201_BUFFER_SIZE); - system_delay_ms(500); // 等待GPS启动后开始初始化 - uart_init(GPS_TAU1201_UART, 115200, GPS_TAU1201_RX, GPS_TAU1201_TX); - uart_rx_interrupt(GPS_TAU1201_UART, 0); - - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)set_rate, sizeof(set_rate)); // 设置GPS更新速率为10hz 如果不调用此语句则默认为1hz - system_delay_ms(200); - - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)open_rmc, sizeof(open_rmc)); // 开启rmc语句 - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)open_gga, sizeof(open_gga)); // 开启gga语句 - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gll, sizeof(close_gll)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gsa, sizeof(close_gsa)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_grs, sizeof(close_grs)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gsv, sizeof(close_gsv)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_vtg, sizeof(close_vtg)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_zda, sizeof(close_zda)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gst, sizeof(close_gst)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_txt, sizeof(close_txt)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_txt_ant, sizeof(close_txt_ant)); - system_delay_ms(50); - - gps_tau1201_state = 1; - uart_rx_interrupt(GPS_TAU1201_UART, 1); -} diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_gps_tau1201.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_gps_tau1201.h deleted file mode 100644 index c167bae..0000000 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_gps_tau1201.h +++ /dev/null @@ -1,117 +0,0 @@ -/********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 -* Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 -* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 -* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* -* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 -* 甚至没有隐含的适销性或适合特定用途的保证 -* 更多细节请参见 GPL -* -* 您应该在收到本开源库的同时收到一份 GPL 的副本 -* 如果没有,请参阅 -* -* 额外注明: -* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 -* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 -* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 -* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* -* 文件名称 zf_device_gps_tau1201 -* 公司名称 成都逐飞科技有限公司 -* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D -* 店铺链接 https://seekfree.taobao.com/ -* -* 修改记录 -* 日期 作者 备注 -* 2022-09-15 pudding first version -* 2023-04-28 pudding 增加中文注释说明 -********************************************************************************************************************/ -/******************************************************************************************************************** -* 接线定义: -* ------------------------------------ -* 模块管脚 单片机管脚 -* RX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_RX 宏定义 -* TX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_TX 宏定义 -* VCC 3.3V电源 -* GND 电源地 -* ------------------------------------ -********************************************************************************************************************/ - -#ifndef _zf_device_gps_tau1201_h_ -#define _zf_device_gps_tau1201_h_ - -#include "zf_common_typedef.h" - -//=================================================定义 定位模块 基本配置================================================ -#define GPS_TAU1201_UART (UART_3) -#define GPS_TAU1201_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 -#define GPS_TAU1201_TX (UART3_RX_P15_7) // GPS TX串口引脚 - -#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 -#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 -#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; // 时间- - uint8 state; // 有效状态 1:定位有效 0:定位无效 - uint16 latitude_degree; // 度 - uint16 latitude_cent; // 分 - uint16 latitude_second; // 秒 - uint16 longitude_degree; // 度 - uint16 longitude_cent; // 分 - uint16 longitude_second; // 秒 - double latitude; // 纬度 - double longitude; // 经度 - int8 ns; // 纬度半球 N(北半球)或 S(南半球) - int8 ew; // 经度半球 E(东经)或 W(西经) - float speed; // 速度(公里/每小时) - float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) - // 下面两个个信息从GNGGA语句中获取 - uint8 satellite_used; // 用于定位的卫星数量 - float height; // 高度 -}gps_info_struct; - -typedef enum -{ - GPS_STATE_RECEIVING, // 正在接收数据 - GPS_STATE_RECEIVED, // 数据接收完成 - GPS_STATE_PARSING, // 正在解析 -}gps_state_enum; -//================================================定义 定位模块 参数结构体================================================ - - -//=================================================声明 定位模块 全局变量================================================ -extern gps_info_struct gps_tau1201; // GPS解析之后的数据 -extern uint8 gps_tau1201_flag; // 1:采集完成等待处理数据 0:没有采集完成 -//=================================================声明 定位模块 全局变量================================================ - - -//=================================================声明 定位模块 基础函数================================================ -double get_two_points_distance (double lat1, double lng1, double lat2, double lng2); // 计算从第一个点到第二个点的距离(单位:m) -double get_two_points_azimuth (double lat1, double lon1, double lat2, double lon2); // 计算从第一个点到第二个点的方位角(单位:°) -uint8 gps_data_parse (void); // 解析GPS数据 -void gps_uart_callback (void); // GPS回调函数 -void gps_init (void); // GPS初始化 -//=================================================声明 定位模块 基础函数================================================ -#endif diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_icm20602.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_icm20602.c index f4ae830..ddebf3c 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_icm20602.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_icm20602.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_icm20602 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_icm20602.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_icm20602.h index 67724ad..209972b 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_icm20602.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_icm20602.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_icm20602 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_imu660ra.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_imu660ra.c index 95144f9..02fdb9e 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_imu660ra.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_imu660ra.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu660ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_imu660ra.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_imu660ra.h index a689df1..348e6a1 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_imu660ra.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_imu660ra.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu660ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_imu963ra.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_imu963ra.c index 92ec0f6..595142a 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_imu963ra.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_imu963ra.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu963ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_imu963ra.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_imu963ra.h index 4d0d9f9..c0f981f 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_imu963ra.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_imu963ra.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu963ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_ips114.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_ips114.c index 78c6f3b..b13e338 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_ips114.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_ips114.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips114 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_ips114.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_ips114.h index 81dfc3c..ba932b1 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_ips114.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_ips114.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips114 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_ips200.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_ips200.c index cd8681f..37d9d04 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_ips200.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_ips200.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips200 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_ips200.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_ips200.h index ce59927..045bf27 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_ips200.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_ips200.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips200 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_key.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_key.c index 9e42c8a..8b240cb 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_key.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_key.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_key * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_key.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_key.h index bcab8aa..9c653cf 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_key.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_key.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_key * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_mpu6050.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_mpu6050.c index dc3c5b2..101a5ae 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_mpu6050.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_mpu6050.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_mpu6050 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_mpu6050.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_mpu6050.h index 3510e06..c8a086f 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_mpu6050.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_mpu6050.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_mpu6050 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_mt9v03x.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_mt9v03x.c index 231cfec..d38b8df 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_mt9v03x.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_mt9v03x.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_mt9v03x * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_mt9v03x.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_mt9v03x.h index 7786bc5..9d4650d 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_mt9v03x.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_mt9v03x.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_mt9v03x * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_oled.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_oled.c index 5314209..55aefa7 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_oled.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_oled.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_oled * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_oled.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_oled.h index d52d2fd..aadf048 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_oled.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_oled.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_oled * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_ov7725.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_ov7725.c index 12f6095..bac95fe 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_ov7725.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_ov7725.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ov7725 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_ov7725.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_ov7725.h index f45a4e8..2cb4026 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_ov7725.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_ov7725.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ov7725 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_scc8660.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_scc8660.c index 3483c93..38d65ff 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_scc8660.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_scc8660.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_scc8660 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_scc8660.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_scc8660.h index 815d272..537283a 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_scc8660.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_scc8660.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_scc8660 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_tft180.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_tft180.c index db50824..b661e91 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_tft180.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_tft180.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_tft180 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_tft180.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_tft180.h index 47491ee..54a72b3 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_tft180.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_tft180.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_tft180 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_tsl1401.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_tsl1401.c index 3f9db7f..d133c7c 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_tsl1401.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_tsl1401.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_tsl1401 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_tsl1401.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_tsl1401.h index 1fab12e..a7b061c 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_tsl1401.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_tsl1401.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_tsl1401 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_type.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_type.c index 497ba55..af24701 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_type.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_type.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_type * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -32,6 +32,7 @@ * 日期 作者 备注 * 2022-09-15 pudding first version * 2023-05-26 pudding 新增SPI WIFI 中断回调指针 +* 2024-01-16 pudding 移除SPI WIFI 中断回调指针 SPI WIFI将不再使用外部 ********************************************************************************************************************/ #include "zf_device_type.h" @@ -45,7 +46,6 @@ callback_function camera_dma_handler = type_default_callback; wireless_type_enum wireless_type = NO_WIRELESS; callback_function wireless_module_uart_handler = type_default_callback; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 -callback_function wireless_module_spi_handler = type_default_callback; // WIFI SPI GPIO中断函数指针,根据初始化时设置的函数进行跳转 tof_type_enum tof_type = NO_TOF; callback_function tof_module_exti_handler = type_default_callback; // ToF 模块 INT 更新中断 @@ -54,7 +54,7 @@ callback_function tof_module_exti_handler = type_default_callback; // 函数简介 默认回调函数 // 参数说明 void // 返回参数 void -// 使用示例 +// 使用示例 // 备注信息 保护性冗余设计 防止在没有初始化设备的时候跑飞 //------------------------------------------------------------------------------------------------------------------- static void type_default_callback (void) @@ -90,14 +90,7 @@ void set_camera_type (camera_type_enum type_set, callback_function vsync_callba void set_wireless_type (wireless_type_enum type_set, callback_function wireless_callback) { wireless_type = type_set; - if(WIFI_SPI == wireless_type) - { - wireless_module_spi_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); - } - else - { - wireless_module_uart_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); - } + wireless_module_uart_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); } //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_type.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_type.h index 19c36ca..3b124fe 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_type.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_type.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_type * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -56,7 +56,6 @@ typedef enum WIRELESS_UART, // 无线串口 BLUETOOTH_CH9141, // 蓝牙 CH9141 WIFI_UART, // 串口 WiFi - WIFI_SPI // SPI WiFi }wireless_type_enum; typedef enum diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c index 2bdb164..3cbc786 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_virtual_oscilloscope * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h index f518026..b0fd085 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_virtual_oscilloscope * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_wifi_spi.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_wifi_spi.c index 78a6d68..f9e51ca 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_wifi_spi.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_wifi_spi.c @@ -24,14 +24,13 @@ * 文件名称 zf_device_wifi_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 * 日期 作者 备注 -* 2023-05-27 pudding first version -* 2023-05-29 pudding 新增关闭休眠指令,提升通讯效率 +* 2022-09-21 SeekFree first version ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,1374 +52,615 @@ #include "zf_common_clock.h" #include "zf_common_debug.h" #include "zf_common_fifo.h" -#include "zf_common_function.h" #include "zf_driver_delay.h" #include "zf_driver_gpio.h" -#include "zf_common_interrupt.h" -#include "zf_driver_exti.h" #include "zf_driver_spi.h" #include "zf_device_type.h" #include "zf_device_wifi_spi.h" -#define WAIT_TIME_OUT (10000) // 单指令等待时间 单位:ms +#define WIFI_CONNECT_TIME_OUT 10000 // 单位毫秒 +#define SOCKET_CONNECT_TIME_OUT 50000 // 单位毫秒 +#define OTHER_TIME_OUT 1000 // 单位毫秒 -#define WIFI_SPI_WRITE_MAX 128 // 定义一次SPI通讯最大发送的数据长度 - -#define WIFI_SPI_WRITE_REQUEST 0x01 -#define WIFI_SPI_CHECK_STATE 0x02 -#define WIFI_SPI_WRITE_DATA 0x03 -#define WIFI_SPI_READ_DATA 0x04 -#define WIFI_SPI_WRITE_END 0x07 -#define WIFI_SPI_READ_END 0x08 - -#define WIFI_SPI_WRITE_ADDR 0x00 -#define WIFI_SPI_STATE_ADDR 0x04 +char wifi_spi_version[12]; // 保存模块固件版本信息 +char wifi_spi_mac_addr[20]; // 保存模块MAC地址信息 +char wifi_spi_ip_addr_port[25]; // 保存模块IP地址与端口信息 -volatile wifi_spi_buffer_state_enum wifi_buffer_state; -volatile wifi_spi_transmit_state_enum wifi_transmit_state; - -static fifo_obj_struct wifi_spi_fifo; -static uint8 wifi_spi_buffer[WIFI_SPI_BUFFER_SIZE]; // 数据存放数组 - -vuint8 wifi_spi_ack_flag = 0; // 0:模块未应答 1:模块已应答 -uint8 wifi_spi_init_flag; // 0:模块未初始化成功或者未连接 1:模块已连接并成功初始化 -vuint8 wifi_spi_packet_num; // 发送的数据包ID -vuint32 wifi_spi_send_remain_length; // 剩余的发送长度 - - - -wifi_spi_information_struct wifi_spi_information; +static fifo_struct wifi_spi_fifo; +static uint8 wifi_spi_buffer[WIFI_SPI_RECVIVE_FIFO_SIZE]; +static volatile wifi_spi_state_enum wifi_spi_mutex; //------------------------------------------------------------------------------------------------------------------- -// 函数简介 请求写入数据到模块 -// 参数说明 length 需要写入的长度 -// @return void -// Sample usage: +// 函数简介 等待WIFI SPI就绪 +// 参数说明 wait_time 最大等待时间 单位毫秒 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_write_request(uint16 length) +static uint8 wifi_spi_wait_idle (uint32 wait_time) { - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_REQUEST; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - head.magic = 0xFE; - head.sequence = wifi_spi_packet_num++; - head.length = length; + uint32 time = 0; - wifi_transmit_state = TRANSMIT_WRITE_REQUEST; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 7); - gpio_set_level(WIFI_SPI_CS_PIN, 1); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 读取模块状态 -// 参数说明 *length 需要读取或者写入的长度 -// @return WIFI_SPI_BUFFER_STATE_enum 模块状态 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static wifi_spi_buffer_state_enum wifi_spi_read_state(uint16 *length) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_CHECK_STATE; - head.addr = WIFI_SPI_STATE_ADDR; - head.dummy = 0x00; - - wifi_spi_ack_flag = 0; - wifi_transmit_state = TRANSMIT_READ_STATE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_transfer_8bit(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, &head.cmd, 7); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - - if(BUFFER_WRITE == head.magic) + wait_time = wait_time*100; + while(0 == gpio_get_level(WIFI_SPI_INT_PIN)) { - wifi_spi_packet_num = head.sequence; - } - *length = head.length; - - return (wifi_spi_buffer_state_enum)head.magic; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据发送完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_done(void) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_END; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_transmit_state = TRANSMIT_IDLE; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据接收完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_start(void) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_READ_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - wifi_transmit_state = TRANSMIT_READ; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据接收完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_done(void) -{ - wifi_spi_buffer_struct head; - - gpio_set_level(WIFI_SPI_CS_PIN, 1); - - head.cmd = WIFI_SPI_READ_END; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_transmit_state = TRANSMIT_IDLE; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块 -// 参数说明 *buff 需要写入数据的首地址 -// 参数说明 length 需要写入数据的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_data(const uint8 *buff, uint16 length) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - wifi_transmit_state = TRANSMIT_WRITE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - spi_write_8bit_array(WIFI_SPI_INDEX, buff, length); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_spi_send_done(); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_data_multi(wifi_spi_send_multi_struct *multi_buffer) -{ - uint8 i; - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - wifi_transmit_state = TRANSMIT_WRITE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - - for(i = 0; i < WIFI_SPI_MAX_MULTI; i++) - { - if(NULL != multi_buffer->source[i]) spi_write_8bit_array(WIFI_SPI_INDEX, multi_buffer->source[i], multi_buffer->length[i]); - } - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_spi_send_done(); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 接收模块发送的数据 -// 参数说明 *buff 接收数组的缓冲区首地址 -// 参数说明 length 需要接收的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_data(uint8 *buff, uint16 length) -{ - spi_read_8bit_array(WIFI_SPI_INDEX, buff, length); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送命令到模块 -// 参数说明 *str 命令字符串首地址 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_command(const char *str) -{ - uint8 state = 0; - uint16 send_length; - uint16 wait_time = 0; - - // 请求发送数据 - send_length = (uint16)strlen(str); - - // 等待传输进入空闲 - while(TRANSMIT_IDLE != wifi_transmit_state); - - // 如果没有进入发送状态则重新请求发送数据 - while(BUFFER_WRITE != wifi_buffer_state) - { - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - while(!wifi_spi_ack_flag) - { - wait_time++; - if((WAIT_TIME_OUT / 4) <= wait_time) - { - state = 1; - wifi_spi_init_flag = 0; // 模块已断开 - break; - } - system_delay_ms(1); - } - - if(1 == state) + system_delay_us(10); + time++; + if(wait_time <= time) { break; } } - - wifi_buffer_state = BUFFER_IDLE; - - if(0 == state) // 通讯未超时 - { - wifi_spi_send_remain_length = send_length; - // 发送消息 - wifi_spi_send_data((const uint8 *)str, send_length); - } + return (wait_time <= time); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 检查模块状态并读取模块发送的数据 -// 参数说明 void -// @return void -// Sample usage: +// 函数简介 写入数据到WIFI SPI +// 参数说明 *buffer1 第一组需要发送的数据缓冲区地址 +// 参数说明 length1 第一组数据长度 +// 参数说明 *buffer2 第二组需要发送的数据缓冲区地址 +// 参数说明 length2 第二组数据长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -void wifi_spi_check_state_read_buffer(void) +static void wifi_spi_write (const uint8 *buffer1, uint16 length1, const uint8 *buffer2, uint16 length2) { - uint16 wifi_spi_receive_length; // 本次接收到的数据数量 - uint8 wifi_spi_receive_buffer[WIFI_SPI_WRITE_MAX]; - - // 查询WIFI模块的状态 - wifi_buffer_state = wifi_spi_read_state(&wifi_spi_receive_length); - - // 如果需要读取WIFI模块数据,则保存需要读取的长度 - if(BUFFER_READ == wifi_buffer_state) + gpio_low(WIFI_SPI_CS_PIN); + if(NULL != buffer1) { - wifi_spi_receive_start(); - do - { - if(wifi_spi_receive_length > WIFI_SPI_WRITE_MAX) - { - wifi_spi_receive_data((uint8 *)wifi_spi_receive_buffer, WIFI_SPI_WRITE_MAX); - fifo_write_buffer(&wifi_spi_fifo, wifi_spi_receive_buffer, WIFI_SPI_WRITE_MAX); // 存入 FIFO - wifi_spi_receive_length = wifi_spi_receive_length - WIFI_SPI_WRITE_MAX; - } - else - { - wifi_spi_receive_data((uint8 *)wifi_spi_receive_buffer, wifi_spi_receive_length); - fifo_write_buffer(&wifi_spi_fifo, wifi_spi_receive_buffer, wifi_spi_receive_length); // 存入 FIFO - wifi_spi_receive_length = 0; - } - }while(wifi_spi_receive_length > 0); - wifi_spi_receive_done(); + spi_write_8bit_array(WIFI_SPI_INDEX, buffer1, length1); } - else if(BUFFER_IDLE == wifi_buffer_state) + if(NULL != buffer2) { - // 如果模块内部缓冲区状态为空闲,则传输状态也设置为空闲 - wifi_transmit_state = TRANSMIT_IDLE; + spi_write_8bit_array(WIFI_SPI_INDEX, buffer2, length2); } + gpio_high(WIFI_SPI_CS_PIN); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块 -// 参数说明 *buff 需要发送的数据首地址 -// 参数说明 length 需要发送的长度 -// @return uint32 剩余未发送长度 -// Sample usage: +// 函数简介 WIFI SPI 发送与接收同时进行(命令收发) +// 参数说明 *packets 发送与接收的地址 +// 参数说明 length 需要接收的长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_write_data(const uint8 *buff, uint32 length) +static void wifi_spi_transfer_command (wifi_spi_packets_struct *packets, uint16 length) { - uint16 send_length; - uint32 wait_time; + gpio_low(WIFI_SPI_CS_PIN); - // 记录需要发送的长度 - wifi_spi_send_remain_length = length; - - while(wifi_spi_send_remain_length) + spi_transfer_8bit(WIFI_SPI_INDEX, (uint8 *)&(packets->head), (uint8 *)&(packets->head), sizeof(wifi_spi_head_struct)); + + if(length) { - send_length = (uint16)func_limit_ab(wifi_spi_send_remain_length, 1, WIFI_SPI_WRITE_MAX); - - // 请求发送数据 - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - - // 最长等待5秒 - wait_time = 5000; - while(!wifi_spi_ack_flag) - { - wait_time--; - if(0 == wait_time) break; - system_delay_ms(1); - } - - if(BUFFER_WRITE == wifi_buffer_state) - { - // 发送消息 - wifi_spi_send_data(buff, send_length); - buff += send_length; - wifi_spi_send_remain_length -= send_length; - wifi_buffer_state = BUFFER_IDLE; - } - else - { - break; - } + spi_transfer_8bit(WIFI_SPI_INDEX, (const uint8 *)(packets->buffer), packets->buffer, length); } - - return wifi_spi_send_remain_length; + + gpio_high(WIFI_SPI_CS_PIN); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// @return uint32 剩余未发送长度 -// Sample usage: 发送数据总长度不能超过4092个 +// 函数简介 WIFI SPI 发送与接收同时进行(数据收发) +// 参数说明 *write_data 发送的数据缓冲区地址 +// 参数说明 *read_data 接收到的数据的存储地址 +// 参数说明 length 需要接收的长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_write_data_multi(wifi_spi_send_multi_struct *multi_buffer) +static void wifi_spi_transfer_data (const uint8 *write_data, wifi_spi_packets_struct *read_data, uint16 length) { - uint16 send_length; - uint32 wait_time; + gpio_low(WIFI_SPI_CS_PIN); - // 记录需要发送的长度 - send_length = multi_buffer->length[0] + multi_buffer->length[1] + multi_buffer->length[2] + multi_buffer->length[3] + multi_buffer->length[4] + multi_buffer->length[5] + multi_buffer->length[6] + multi_buffer->length[7]; + read_data->head.command = WIFI_SPI_DATA; + read_data->head.length = length; - if(WIFI_SPI_WRITE_MAX >= send_length) + spi_transfer_8bit(WIFI_SPI_INDEX, (uint8 *)&(read_data->head), (uint8 *)&(read_data->head), sizeof(wifi_spi_head_struct)); + + if(WIFI_SPI_RECVIVE_SIZE < length) { - // 请求发送数据 - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - - // 最长等待5秒 - wait_time = 5000; - while(!wifi_spi_ack_flag) - { - wait_time--; - if(0 == wait_time) break; - system_delay_ms(1); - } - - if(BUFFER_WRITE == wifi_buffer_state) - { - // 发送消息 - wifi_spi_send_data_multi(multi_buffer); - send_length = 0; - wifi_buffer_state = BUFFER_IDLE; - } + spi_transfer_8bit(WIFI_SPI_INDEX, write_data, read_data->buffer, WIFI_SPI_RECVIVE_SIZE); + spi_write_8bit_array(WIFI_SPI_INDEX, &write_data[WIFI_SPI_RECVIVE_SIZE], length - WIFI_SPI_RECVIVE_SIZE); } - - return send_length; + else + { + // 将需要发送的数据拷贝到读取缓冲区,避免出现write_data越界访问 + memcpy(read_data->buffer, write_data, length); + spi_transfer_8bit(WIFI_SPI_INDEX, read_data->buffer, read_data->buffer, WIFI_SPI_RECVIVE_SIZE); + } + gpio_high(WIFI_SPI_CS_PIN); } -//-------------------------------------------------------------------------------------------------- -// 函数简介 等待模块响应 -// 参数说明 *wait_buffer 等待的响应的字符串 -// 参数说明 timeout 超时时间 -// 返回参数 uint8 0:模块响应指定数据 1:模块未响应指定数据或超时 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_wait_ack (char *wait_buffer, uint32 timeout) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 参数设置 +// 参数说明 command 命令类型 +// 参数说明 *buffer 参数地址 +// 参数说明 length 参数长度 +// 参数说明 wait_time 最大等待时间 单位100微妙 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_set_parameter (wifi_spi_packets_command_enum command, uint8 *buffer, uint16 length, uint32 wait_time) { - uint8 return_state = 1; - char receiver_buffer[8] = {0, 0, 0, 0, 0, 0, 0, 0}; - uint32 receiver_len = 8; - + uint8 return_state; + wifi_spi_head_struct head; + return_state = 1; do { - system_delay_ms(1); - // 判断接收缓冲区内是否有需要响应的指定数据 如果有 则跳出循环并且返回0 - receiver_len = 8; - fifo_read_tail_buffer(&wifi_spi_fifo, (uint8 *)receiver_buffer, &receiver_len, FIFO_READ_ONLY); + head.command = command; + head.length = length; + + // 等待从机准备就绪 + if(wifi_spi_wait_idle(wait_time)) + { + break; + } - if(strstr(receiver_buffer, wait_buffer)) + wifi_spi_write(&head.command, sizeof(wifi_spi_head_struct), buffer, length); + if(wifi_spi_wait_idle(wait_time)) + { + break; + } + // 接收应答信号 + + head.command = WIFI_SPI_DATA; + head.length = 0; + wifi_spi_transfer_command((wifi_spi_packets_struct *)&head, head.length); + system_delay_us(20); + if(WIFI_SPI_REPLY_OK == head.command) { return_state = 0; - break; } - else if(strstr(receiver_buffer, "ERROR") || strstr(receiver_buffer, "busy")) - { - // 如果接收到报错或者模块忙 则跳出循环并且返回1 - return_state = 1; - break; - } - }while(timeout --); + }while(0); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 清除WiFi接收缓冲区内容 -// 参数说明 void -// 返回参数 void -// 使用示例 wifi_spi_clear_receive_buffer(); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static void wifi_spi_clear_receive_buffer (void) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 模块信息获取 +// 参数说明 command 命令类型 +// 参数说明 *buffer 保存接收到的参数地址 +// 参数说明 wait_time 最大等待时间 单位100微妙 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_parameter (wifi_spi_packets_command_enum command, wifi_spi_packets_struct *read_data, uint32 wait_time) { - // 清空WiFi接收缓冲区 - fifo_clear(&wifi_spi_fifo); -} + uint8 return_state; -//-------------------------------------------------------------------------------------------------- -// 函数简介 模块数据解析 -// 参数说明 *target_buffer 目标存放地址指针 字符串数组 -// 参数说明 *origin_buffer 数据来源地址指针 字符串数组 -// 参数说明 start_char 起始提取字节 例如从 "1234" 中从 '2' 开始提取 就应该填入 '2' -// 参数说明 end_char 结束提取字节 例如从 "1234" 中在 '4' 结束提取 就应该填入 '\0'(0x00 空字符 一般是字符串结尾) -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_data_parse(wifi_spi_information.mac, wifi_spi_receive_buffer, '"', '"'); // 调用获取本机mac地址后,调用此函数提取mac地址 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char start_char, char end_char) -{ - uint8 return_state = 0; - char *location1; - char *location2; - location1 = strchr((char *)origin_buffer, start_char); - if(location1) + return_state = 1; + do { - location1 ++; - location2 = strchr(location1, end_char); - if(location2) + // 等待从机准备就绪 + if(wifi_spi_wait_idle(wait_time)) { - memcpy(target_buffer, location1, location2-location1); + break; } - else + read_data->head.command = command; + wifi_spi_write(&(read_data->head.command), WIFI_SPI_RECVIVE_SIZE, NULL, 0); + + if(wifi_spi_wait_idle(wait_time)) { - return_state = 1; + break; } - } - else - { - return_state = 1; - } + read_data->head.command = WIFI_SPI_DATA; + read_data->head.length = 0; + wifi_spi_transfer_command(read_data, WIFI_SPI_RECVIVE_SIZE); + return_state = 0; + }while(0); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 查看模块版本信息 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_get_version(); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 固件版本获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,固件版本信息以字符串形式保存在wifi_spi_version数组中 +//------------------------------------------------------------------------------------------------------------------- static uint8 wifi_spi_get_version (void) { - char *location1; - uint8 return_state = 0; - uint8 receiver_buffer[256]; - uint32 receiver_len = 256; + uint8 return_state; + wifi_spi_packets_struct temp_packets; - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+GMR\r\n"); - do + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_VERSION, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_VERSION == temp_packets.head.command)) { - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - location1 = strrchr((char *)receiver_buffer, ':'); - if(wifi_spi_data_parse(wifi_spi_information.version, (uint8 *)location1, ':', '(')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - + memcpy(wifi_spi_version, temp_packets.buffer, temp_packets.head.length); + } return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 模块回显设置 -// 参数说明 model 0:关闭模块的回写功能 其他:开启模块回写 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_echo_set("1");//开启模块回写功能 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_echo_set (char *model) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI MAC地址获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,MAC地址信息以字符串形式保存在wifi_spi_mac_addr数组中 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_mac_addr (void) { - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - if('1' == *model) + uint8 return_state; + wifi_spi_packets_struct temp_packets; + + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_MAC_ADDR, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_MAC_ADDR == temp_packets.head.command)) { - wifi_spi_send_command("ATE1\r\n"); + memcpy(wifi_spi_mac_addr, temp_packets.buffer, temp_packets.head.length); + } + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI IP地址与端口号获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 +// 需要在连接Socket之后调用此函数才能正常获取信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_ip_addr_port (void) +{ + uint8 return_state; + wifi_spi_packets_struct temp_packets; + + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_IP_ADDR, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_IP_ADDR == temp_packets.head.command)) + { + memcpy(wifi_spi_ip_addr_port, temp_packets.buffer, temp_packets.head.length); + } + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 设置连接的WiFi信息并尝试连接WiFi +// 参数说明 *wifi_ssid WIFI名称 +// 参数说明 *pass_word WIFI密码 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_wifi_connect("SEEKFREE", "SEEKFREE123"); +// 备注信息 wifi_spi_wifi_connect("SEEKFREE", NULL); // 连接没有密码的WIFI热点 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_wifi_connect (char *wifi_ssid, char *pass_word) +{ + uint8 return_state; + uint8 temp_buffer[64]; + uint16 length; + + if(NULL != pass_word) + { + // WIFI热点有密码发送热点名称与密码 + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n%s\r\n", wifi_ssid, pass_word); } else { - wifi_spi_send_command("ATE0\r\n"); + // WIFI热点没有密码只需要发送热点名称 + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n", wifi_ssid); } - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + return_state = wifi_spi_set_parameter(WIFI_SPI_SET_WIFI_INFORMATION, temp_buffer, length, WIFI_CONNECT_TIME_OUT); + + // 本机IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 + wifi_spi_get_ip_addr_port(); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块自身 的 MAC 地址 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_mac()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_mac (void) -{ - uint8 return_state = 0; - uint8 receiver_buffer[64]; - uint32 receiver_len = 64; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPAPMAC?\r\n"); - do - { - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - if(wifi_spi_data_parse(wifi_spi_information.mac, receiver_buffer, '"', '"')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块或者目标WIFI 的 IP 地址(取决于模块当前的工作模式) -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_ip()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_ip (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_STATION == wifi_spi_information.mode) - { - wifi_spi_send_command("AT+CIPSTA?\r\n"); - } - else if(WIFI_SPI_SOFTAP == wifi_spi_information.mode) - { - wifi_spi_send_command("AT+CIPAP?\r\n"); - } - - do - { - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - uint8 receiver_buffer[128]; - uint32 receiver_len = 128; - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - if(wifi_spi_data_parse(wifi_spi_information.local_ip, receiver_buffer, '"', '"')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块的相关信息 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_information()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_information (void) -{ - uint8 return_state = 0; - do - { - // 获取模块版本号 - if(wifi_spi_get_version()) - { - return_state = 1; - break; - } - // 获取模块IP地址 - if(wifi_spi_get_ip()) - { - return_state = 1; - break; - } - // 获取模块MAC信息 - if(wifi_spi_get_mac()) - { - return_state = 1; - break; - } - memcpy(wifi_spi_information.local_port, "no port", 7); - }while(0); - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 连接 WiFi -// 参数说明 wifi_ssid WiFi名称 -// 参数说明 pass_word WiFi密码 -// 参数说明 model 0:查询WiFi连接情况 其他:连接WiFi -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_get_or_connect_wifi("WiFi_name", "Pass_word", 1); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_wifi (char *wifi_ssid, char *pass_word) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SOFTAP == wifi_spi_information.mode) - { - sprintf(temp, "AT+CWSAP=\"%s\",\"%s\",5,3\r\n", wifi_ssid, pass_word); - wifi_spi_send_command(temp); - } - else - { - sprintf(temp, "AT+CWJAP=\"%s\",\"%s\"\r\n", wifi_ssid, pass_word); - wifi_spi_send_command(temp); - } - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 上电是否自动连接WiFi -// 参数说明 model 0:上电不自动连接wifi 其他:上电自动连接wifi -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_auto_connect_wifi(0); //上电不自动连接wifi -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_auto_connect_wifi (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CWAUTOCONN=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置连接模式 -// 参数说明 model 0: 单连接模式 1:多连接模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_connect_model("1"); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_connect_model (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPMUX=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置传输模式 -// 参数说明 model – 0: 普通传输模式 IP断开后不重新连接 -// – 1: Wi-Fi 透传接收模式,仅支持 TCP 单连接、UDP 固定通信对端、SSL 单连接的情况 IP断开后会不断尝试重新连接 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_transfer_model("1"); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_transfer_model (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPMODE=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置模块模式 (Station/SoftAP/Station+SoftAP) -// 参数说明 state 0:无 Wi-Fi 模式,并且关闭 Wi-Fi RF----1: Station 模式----2: SoftAP 模式----3: SoftAP+Station 模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_model("1"); +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 设置连接的Socket信息并尝试连接Socket +// 参数说明 *transport_type 传输类型 +// 参数说明 *ip_addr IP地址 +// 参数说明 *port 目标端口号 +// 参数说明 *local_port 本机端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_socket_connect("TCP", "192.168.2.5", "8080", "6060"); // 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_set_model (wifi_spi_mode_enum mode) +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_socket_connect (char *transport_type, char *ip_addr, char *port, char *local_port) { - uint8 return_state = 0; + uint8 return_state; + uint8 temp_buffer[41]; + uint16 length; + + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n%s\r\n%s\r\n%s\r\n", transport_type, ip_addr, port, local_port); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + return_state = wifi_spi_set_parameter(WIFI_SPI_SET_SOCKET_INFORMATION, temp_buffer, length, SOCKET_CONNECT_TIME_OUT); - if(WIFI_SPI_SOFTAP == mode) - { - wifi_spi_send_command("AT+CWMODE=2\r\n"); - } - else - { - wifi_spi_send_command("AT+CWMODE=1\r\n"); - } - // 设置模块工作模式 - wifi_spi_information.mode = mode; - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + // 本机IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 + wifi_spi_get_ip_addr_port(); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 关闭睡眠模式 -// 参数说明 mode -// 返回参数 uint8 0:成功 1:失败 +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 断开Socket连接 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_socket_disconnect(); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_socket_disconnect (void) +{ + wifi_spi_packets_struct temp_packets; + + return wifi_spi_get_parameter(WIFI_SPI_CLOSE_SOCKET, &temp_packets, OTHER_TIME_OUT); +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 软复位 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 // 使用示例 // 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_close_sleep_model (void) +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_reset (void) { - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+SLEEP=0\r\n"); - // 设置模块工作模式 - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 断开与wifi的连接 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_disconnected_wifi(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_disconnected_wifi (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CWQAP\r\n"); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 进入打开透传模式 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_entry_serianet(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_entry_serianet (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPSEND\r\n"); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 退出透传模式 -// 参数说明 model 0:关闭透传模式 其他:开启透传模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_exit_serianet(1); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_exit_serianet (void) -{ - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - system_delay_ms(20); - wifi_spi_send_command("+++"); - system_delay_ms(1000); - - return 0; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 建立TCP连接 -// 参数说明 ip 远端 IPv4 地址、IPv6 地址,或域名 -// 参数说明 port 远端端口值 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_connect_tcp_servers("192.168.101.110", "8080"); -// 备注信息 如果总是连接不上电脑的TCP服务器 可以尝试使用网线连接电脑 -// 如果是使用WiFi连接 可能会导致模块连接TCP服务器等待较长时间 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_connect_tcp_servers (char *ip, char *port, wifi_spi_transfer_mode_enum mode) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + uint8 return_state; + wifi_spi_head_struct head; + return_state = 1; do { - if(wifi_spi_set_connect_model("0")) + head.command = WIFI_SPI_RESET; + head.length = 0xA5A5; + return_state = wifi_spi_wait_idle(OTHER_TIME_OUT); + if(return_state) { - return_state = 1; break; } + wifi_spi_write(&head.command, sizeof(wifi_spi_head_struct), NULL, 0); + }while(0); + + return return_state; +} - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPSTARTEX=\"TCP\",\"%s\",%s\r\n", ip, port); - wifi_spi_send_command(temp); - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI UDP模式时立即发送函数 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 在UDP模式下模块收到数据后会等待2毫秒,2毫秒后未收到数据则将数据通过socket发送到网络,如果希望立即发送则在数据传输完毕后调用此函数 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_udp_send_now (void) +{ + uint8 return_state = 1; + wifi_spi_packets_struct temp_packets; + + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + do { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - // 设置传输模式 - if(wifi_spi_set_transfer_model(WIFI_SPI_COMMAND == mode ? "0" : "1")) - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPSTATE?\r\n"); - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - else - { - uint8 receiver_buffer[128]; - uint32 receiver_len = 128; - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - char* buffer_index = (char *)receiver_buffer; - char* end_index; - - buffer_index += 22; - buffer_index += strlen(ip); - buffer_index += strlen(port); - end_index = strchr(buffer_index, ','); - - memcpy(wifi_spi_information.local_port, " ", 7); - memcpy(wifi_spi_information.local_port, buffer_index, (end_index - buffer_index)); - } - - wifi_spi_information.connect_state = WIFI_SPI_SERVER_ON; - wifi_spi_information.connect_mode = WIFI_SPI_TCP_CLIENT; - wifi_spi_information.transfer_mode = mode; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SERIANET == mode) // 透传模式下直接开启透传 - { - if(wifi_spi_entry_serianet()) + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) { - return_state = 1; break; } - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 建立UDP连接 -// 参数说明 *ip 远端 IPv4 地址、IPv6 地址 或域名 字符串形式 -// 参数说明 *port 远端端口值 字符串形式 -// 参数说明 *local_port 远端 IPv4 地址、IPv6 地址 或域名 字符串形式 -// 参数说明 mode 模块数据通信模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_connect_udp_client("192.168.101.110", "8080", "8080", WIFI_SPI_COMMAND); -// 备注信息 自动分配ID -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_connect_udp_client (char *ip, char *port, char *local_port, wifi_spi_transfer_mode_enum mode) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - do - { - if(wifi_spi_set_connect_model("0")) - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + // 立即开始socket发送 + temp_packets.head.command = WIFI_SPI_UDP_SEND; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + + // 等待应答信号 + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + + // 接收应答信号 + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, temp_packets.head.length); + + if(WIFI_SPI_REPLY_OK == temp_packets.head.command) + { + return_state = 0; + } + + }while(0); - sprintf(temp, "AT+CIPSTARTEX=\"UDP\",\"%s\",%s,%s\r\n", ip, port, local_port); - wifi_spi_send_command(temp); + // 将通讯状态设置为空闲 + wifi_spi_mutex = WIFI_SPI_IDLE; + } + + return return_state; +} - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 数据块发送函数并同步接收数据 +// 参数说明 *buff 需要发送的数据地址 +// 参数说明 length 发送长度 +// 返回参数 uint32 剩余未发送的长度 +// 使用示例 wifi_spi_send_buffer(buffer, 100); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +uint32 wifi_spi_send_buffer (const uint8 *buffer, uint32 length) +{ + uint16 send_length; + wifi_spi_packets_struct temp_packets; + + // 检查WIFI SPI状态,如果在其他中断或者线程中已经发起了通讯,则本次不能发送数据 + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + + while(length) { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_spi_set_transfer_model(WIFI_SPI_COMMAND == mode ? "0" : "1")) // 设置传输模式 - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SERIANET == mode) // 透传模式下直接开启透传 - { - if(wifi_spi_entry_serianet()) + send_length = length > WIFI_SPI_TRANSFER_SIZE ? (uint16)WIFI_SPI_TRANSFER_SIZE : (uint16)length; + + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) { - return_state = 1; break; } - } - memcpy(wifi_spi_information.local_port, " ", 7); - memcpy(wifi_spi_information.local_port, local_port, strlen(local_port)); - wifi_spi_information.connect_state = WIFI_SPI_SERVER_ON; - wifi_spi_information.connect_mode = WIFI_SPI_UDP_CLIENT; - wifi_spi_information.transfer_mode = mode; - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 断开连接 TCP Server 使用本接口将会断开所有连接 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_disconnect_link(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_disconnect_link (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - do - { - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - wifi_spi_send_command("AT+CIPCLOSE=5\r\n"); - } - else - { - wifi_spi_send_command("AT+CIPCLOSE\r\n"); - } - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送字节函数 -// 参数说明 data 需要发送的数据 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_byte(0xa5); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_byte (uint8 data) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - send_length = 1; - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data(&data, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else - { - send_length = (uint16)wifi_spi_write_data(&data, send_length); - } - } - } - - return send_length; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送缓冲区函数 -// 参数说明 buff 需要发送的数据地址 -// 参数说明 len 发送长度 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_buffer("123", 3); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 len) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - while(len) - { - if((WIFI_SPI_WRITE_MAX * 2) < len) send_length = WIFI_SPI_WRITE_MAX * 2; - else - { - send_length = (uint16)len; - } - len -= send_length; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data(buff, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } - buff += send_length; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else - { - len = wifi_spi_write_data(buff, len); - } - } - } - - return len; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送缓冲区函数(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 -// 备注信息 需要发送多个数组时,采用此函数可以极大的降低通讯时间,发送数据总长度不能超过4092 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_buffer_multi (wifi_spi_send_multi_struct *multi_buffer) -{ - uint8 i; - uint16 remain_length; - - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - for(i = 0; i < WIFI_SPI_MAX_MULTI; i++) - { - if(multi_buffer->source[i]) wifi_spi_send_buffer(multi_buffer->source[i], multi_buffer->length[i]); - } - } - else - { - remain_length = (uint16)wifi_spi_write_data_multi(multi_buffer); - } - } - } - - return remain_length; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送字符串函数 -// 参数说明 *str 需要发送的数据 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_string("123"); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_string (const char *str) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - send_length = (uint16)strlen(str); - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data((uint8 *)str, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } + wifi_spi_transfer_data(buffer, &temp_packets, send_length); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) { - send_length = (uint16)wifi_spi_write_data((uint8 *)str, send_length); + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + + length -= send_length; + buffer += send_length; + } + + // 检查最后一次的接收是否将所有的数据都接收完毕 + while(WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) + { + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + + // 继续读取模块剩余数据 + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } } } + wifi_spi_mutex = WIFI_SPI_IDLE; } - - return send_length; + return length; } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi 模块数据接收函数 -// 参数说明 buffer 接收数据的存放地址 -// 参数说明 len 数组长度,可直接填写或者使用sizeof求得 -// 返回参数 uint32 返回实际接收到的数据长度 -// 使用示例 uint8 test_buffer[256]; wifi_spi_read_buffer(&test_buffer[0], sizeof(test_buffer)); +// 函数简介 WIFI SPI 读取缓冲区 +// 参数说明 *buff 接收缓冲区 +// 参数说明 length 读取数据长度 +// 返回参数 uint32 实际读取数据长度 +// 使用示例 wifi_spi_read_buffer(buffer, 100); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 len) +uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 length) { - fifo_read_buffer(&wifi_spi_fifo, buffer, &len, FIFO_READ_AND_CLEAN); - return len; + zf_assert(NULL != buffer); + uint32 data_len = length; + +#if(1 == WIFI_SPI_READ_TRANSFER) + + wifi_spi_packets_struct temp_packets; + // 检查WIFI SPI状态,如果在其他中断或者线程中已经发起了通讯,则本次不能发送数据 + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + + // 发起通讯查看模块内是否有数据未读取 + do + { + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + }while(WIFI_SPI_REPLY_DATA_START == temp_packets.head.command); + wifi_spi_mutex = WIFI_SPI_IDLE; + } +#endif + + fifo_read_buffer(&wifi_spi_fifo, buffer, &data_len, FIFO_READ_AND_CLEAN); + return data_len; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 wifi spi handshake中断回调函数 -// 参数说明 void -// 返回参数 void -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -void wifi_spi_callback (void) -{ - wifi_spi_check_state_read_buffer(); - wifi_spi_ack_flag = 1; // ACK标志位置1 -} - - //------------------------------------------------------------------------------------------------------------------- // 函数简介 WiFi 模块初始化 // 参数说明 *wifi_ssid 目标连接的 WiFi 的名称 字符串形式 // 参数说明 *pass_word 目标连接的 WiFi 的密码 字符串形式 -// 参数说明 wifi_mode 模块的工作模式 参照 zf_device_wireless_spi.h 中 wifi_spi_mode_enum 枚举 // 返回参数 uint8 模块初始化状态 0-成功 1-错误 -// 使用示例 wifi_spi_init("SEEKFREE_2.4G", "SEEKFREEV2", WIFI_UART_STATION); -// 备注信息 初始化会首先设置串口配置,之后会对模块进行基本参数配置 -// 具体的配置信息可以在 zf_device_wireless_spi.h 文件中修改 +// 使用示例 wifi_spi_init("SEEKFREE", "SEEKFREE123"); +// 备注信息 wifi_spi_init("SEEKFREE", NULL); // 连接没有密码的WIFI热点 //------------------------------------------------------------------------------------------------------------------- -uint8 wifi_spi_init (char *wifi_ssid, char *pass_word, wifi_spi_mode_enum wifi_mode) +uint8 wifi_spi_init (char *wifi_ssid, char *pass_word) { uint8 return_state = 0; - uint32 temp_isr; - - spi_init(WIFI_SPI_INDEX, SPI_MODE0, WIFI_SPI_SPEED, WIFI_SPI_SCK_PIN, WIFI_SPI_MOSI_PIN, WIFI_SPI_MISO_PIN, SPI_CS_NULL);//硬件SPI初始化 - set_wireless_type(WIFI_SPI, wifi_spi_callback); - fifo_init(&wifi_spi_fifo, FIFO_DATA_8BIT, wifi_spi_buffer, WIFI_SPI_BUFFER_SIZE); + fifo_init(&wifi_spi_fifo, FIFO_DATA_8BIT, wifi_spi_buffer, WIFI_SPI_RECVIVE_FIFO_SIZE); + spi_init(WIFI_SPI_INDEX, SPI_MODE3, WIFI_SPI_SPEED, WIFI_SPI_SCK_PIN, WIFI_SPI_MOSI_PIN, WIFI_SPI_MISO_PIN, SPI_CS_NULL);//硬件SPI初始化 gpio_init(WIFI_SPI_CS_PIN, GPO, 1, GPO_PUSH_PULL); gpio_init(WIFI_SPI_RST_PIN, GPO, 1, GPO_PUSH_PULL); - - temp_isr = interrupt_global_disable(); - - exti_init(WIFI_SPI_INT_PIN, EXTI_TRIGGER_RISING); - + gpio_init(WIFI_SPI_INT_PIN, GPI, 0, GPI_PULL_DOWN); + + // 复位 gpio_set_level(WIFI_SPI_RST_PIN, 0); - system_delay_ms(50); + system_delay_ms(10); gpio_set_level(WIFI_SPI_RST_PIN, 1); - system_delay_ms(1000); + + // 等待模块初始化 + system_delay_ms(100); + wifi_spi_mutex = WIFI_SPI_IDLE; - exti_flag_clear(WIFI_SPI_INT_PIN); - - interrupt_global_enable(temp_isr); do { - if(wifi_spi_echo_set("0")) // 关闭模块回写 + // 固件版本信息以字符串形式保存在wifi_spi_version数组中 + return_state = wifi_spi_get_version(); + if(return_state) + { + break; + } + + // MAC地址信息以字符串形式保存在wifi_spi_mac_addr数组中 + wifi_spi_get_mac_addr(); + + + return_state = wifi_spi_wifi_connect(wifi_ssid, pass_word); + if(return_state) { - zf_log(0, "exit echo failed"); - return_state = 1; break; } - if(wifi_spi_auto_connect_wifi("0")) // 关闭自动连接 + #if(1 == WIFI_SPI_AUTO_CONNECT) + return_state = wifi_spi_socket_connect("TCP", WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT); + if(return_state) { - zf_log(0, "close auto connect failed"); - return_state = 1; break; } - - if(wifi_spi_set_model(wifi_mode)) // 设置运行模式 + #endif + + #if(2 == WIFI_SPI_AUTO_CONNECT) + return_state = wifi_spi_socket_connect("UDP", WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT); + if(return_state) { - zf_log(0, "set run mode failed"); - return_state = 1; break; } - - if(wifi_spi_close_sleep_model()) // 关闭睡眠模式 - { - zf_log(0, "set sleep mode failed"); - return_state = 1; - break; - } - - if(wifi_spi_set_wifi((char *)wifi_ssid, (char *)pass_word)) // 连接 wifi 或者开启热点 - { - zf_log(0, "wifi set failed"); - return_state = 1; - break; - } - - if(wifi_spi_get_information()) // 模块基本参数获取 - { - zf_log(0, "get module information failed"); - return_state = 1; - break; - } -#if WIFI_SPI_AUTO_CONNECT == 1 - if(wifi_spi_connect_tcp_servers(WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_SERIANET)) // 连接TCP服务器 - { - zf_log(0, "connect TCP server failed"); - return_state = 1; - break; - } -#endif -#if WIFI_SPI_AUTO_CONNECT == 2 - if(wifi_spi_connect_udp_client(WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT, WIFI_SPI_SERIANET)) // 建立UDP连接 - { - zf_log(0, "connect UDP server failed"); - return_state = 1; - break; - } -#endif - // 模块初始化成功 - wifi_spi_init_flag = 1; + #endif }while(0); - + return return_state; } diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_wifi_spi.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_wifi_spi.h index 5e5a025..24e7eb1 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_wifi_spi.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_wifi_spi.h @@ -24,13 +24,13 @@ * 文件名称 zf_device_wifi_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 * 日期 作者 备注 -* 2023-05-27 pudding first version +* 2024-01-18 SeekFree first version ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,128 +53,100 @@ #include "zf_common_typedef.h" + #define WIFI_SPI_INDEX (SPI_3 ) // 定义使用的SPI号 -#define WIFI_SPI_SPEED (30 * 1000 * 1000 ) // 硬件 SPI 速率 +#define WIFI_SPI_SPEED (50 * 1000 * 1000 ) // 硬件 SPI 速率 #define WIFI_SPI_SCK_PIN (SPI3_SCLK_P22_3 ) // 定义SPI_SCK引脚 #define WIFI_SPI_MOSI_PIN (SPI3_MOSI_P22_0 ) // 定义SPI_MOSI引脚 #define WIFI_SPI_MISO_PIN (SPI3_MISO_P22_1 ) // 定义SPI_MISO引脚 IPS没有MISO引脚,但是这里任然需要定义,在spi的初始化时需要使用 #define WIFI_SPI_CS_PIN (P22_2 ) // 定义SPI_CS引脚 采用软件CS引脚 -#define WIFI_SPI_INT_PIN (ERU_CH5_REQ1_P15_8) // 定义中断引脚 +#define WIFI_SPI_INT_PIN (P15_8 ) // 定义握手引脚 #define WIFI_SPI_RST_PIN (P23_1 ) // 定义复位引脚 - - -#define WIFI_SPI_BUFFER_SIZE (1024) // 定义SPI接收的缓冲区大小 -#define WIFI_SPI_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不连接 1-自动连接TCP服务器并进入透传模式 2-自动连接UDP服务器并进入透传模式 3:自动建立TCP服务器 - -#if (WIFI_SPI_AUTO_CONNECT > 2) + +#define WIFI_SPI_RECVIVE_FIFO_SIZE (1024) // 接收FIFO大小 +#define WIFI_SPI_READ_TRANSFER (1) // 在调用wifi_spi_read_buffer 是否尝试发起SPI通讯来检测模块内是否有数据需要读取 1:发起SPI通讯 0:不发起SPI通讯,仅读取FIFO + // 如果应用程序中没有任何的地方调用发送函数,则WIFI_SPI_READ_TRANSFER必须设置为1 + +#define WIFI_SPI_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不自动连接 1-自动连接TCP服务器 2-自动连接UDP + +#if (WIFI_SPI_AUTO_CONNECT > 2) #error "WIFI_SPI_AUTO_CONNECT 的值只能为 [0,1,2]" #else -#define WIFI_SPI_TARGET_IP "192.168.2.28" // 连接目标的 IP +#define WIFI_SPI_TARGET_IP "192.168.137.1" // 连接目标的 IP #define WIFI_SPI_TARGET_PORT "8080" // 连接目标的端口 -#define WIFI_SPI_LOCAL_PORT "8080" // 本机端口 +#define WIFI_SPI_LOCAL_PORT "6666" // 本机的端口 0:随机 可设置范围2048-65535 默认 6666 #endif -#define WIFI_SPI_MAX_MULTI (17) // 多地址发送,最大8个地址 -typedef enum -{ - BUFFER_IDLE, // 模块的缓冲区是空闲的 - BUFFER_READ, // 模块的缓冲区有数据需要读取 - BUFFER_WRITE, // 模块的缓冲区是可写的 -}wifi_spi_buffer_state_enum; +#define WIFI_SPI_RECVIVE_SIZE (32) // 每次SPI传输接收的字节数 不允许修改 +#define WIFI_SPI_TRANSFER_SIZE (4088) // 最大SPI传输接收的字节数 不允许修改 + + typedef enum -{ - TRANSMIT_IDLE, // 当前没有传输 - TRANSMIT_WRITE_REQUEST, // 给模块发送了一个传输请求 - TRANSMIT_READ_STATE, // 读取模块状态 - TRANSMIT_READ, // 正在读取模块内部数据 - TRANSMIT_WRITE, // 正在往模块写入数据 -}wifi_spi_transmit_state_enum; - -typedef enum -{ - WIFI_SPI_STATION, // 设备模式 - WIFI_SPI_SOFTAP, // AP模式 -}wifi_spi_mode_enum; - -typedef enum -{ - WIFI_SPI_COMMAND, // 使用命令的方式发送数据 - WIFI_SPI_SERIANET, // 使用透传的方式发送数据 -}wifi_spi_transfer_mode_enum; - -typedef enum -{ - WIFI_SPI_TCP_CLIENT, // 模块连接TCP服务器 - WIFI_SPI_TCP_SERVER, // 模块作为TCP服务器 - WIFI_SPI_UDP_CLIENT, // 模块启用UDP连接 -}wifi_spi_connect_mode_enum; - -typedef enum -{ - WIFI_SPI_SERVER_OFF, // 模块未连接服务器 - WIFI_SPI_SERVER_ON, // 模块已经连接服务器 -}wifi_spi_connect_state_enum; - -typedef enum -{ - WIFI_SPI_LINK_0, // 模块当前链接 0 - WIFI_SPI_LINK_1, // 模块当前链接 1 - WIFI_SPI_LINK_2, // 模块当前链接 2 - WIFI_SPI_LINK_3, // 模块当前链接 3 - WIFI_SPI_LINK_4, // 模块当前链接 4 -}wifi_spi_link_id_enum; - -typedef struct { - uint8 reserve; - uint8 cmd; - uint8 addr; - uint8 dummy; - uint8 magic; - uint8 sequence; - uint16 length; -}wifi_spi_buffer_struct; + // 主机发送的命令 + WIFI_SPI_INVALID1 = 0x00, // 无效数据包 + WIFI_SPI_RESET = 0x01, // 复位命令 + WIFI_SPI_DATA = 0x02, // 透传数据包 + WIFI_SPI_UDP_SEND = 0x03, // UDP下立即发送命令,默认SPI接收数据后2MS未收到数据自动发送数据 + WIFI_SPI_CLOSE_SOCKET = 0x04, // 断开连接 + + WIFI_SPI_SET_WIFI_INFORMATION = 0x10, // 设置WIFI信息命令 + WIFI_SPI_SET_SOCKET_INFORMATION = 0x11, // 设置SOCKET信息命令 + + WIFI_SPI_GET_VERSION = 0x20, // 获取模块版本 + WIFI_SPI_GET_MAC_ADDR = 0x21, // 获取模块MAC地址 + WIFI_SPI_GET_IP_ADDR = 0x22, // 获取模块IP地址 + + // 从机回传的命令 + WIFI_SPI_REPLY_OK = 0x80, // 从机应答的正确命令 + WIFI_SPI_REPLY_ERROR = 0x81, // 从机应答的错误命令 + + WIFI_SPI_REPLY_DATA_START = 0x90, // 从机回传的数据包,并且还有数据需要主机读取 + WIFI_SPI_REPLY_DATA_END = 0x91, // 从机回传的数据包,数据已读取完毕 + + WIFI_SPI_REPLY_VERSION = 0xA0, // 从机回复固件版本 + WIFI_SPI_REPLY_MAC_ADDR = 0xA1, // 从机回复本机MAC地址等信息 + WIFI_SPI_REPLY_IP_ADDR = 0xA2, // 从机回复本机IP地址、端口号 + WIFI_SPI_INVALID2 = 0xFF // 无效数据包 +}wifi_spi_packets_command_enum; + +typedef enum +{ + WIFI_SPI_IDLE, // 模块空闲,可以进行SPI通讯 + WIFI_SPI_BUSY, // 模块正忙,不可进行SPI通讯 +}wifi_spi_state_enum; + + +typedef struct +{ + uint8 command; // 命令字 + uint8 reserve; // 保留 + uint16 length; // 包有效长度 +}wifi_spi_head_struct; + + +typedef struct +{ + wifi_spi_head_struct head; // 帧头 + uint8 buffer[WIFI_SPI_RECVIVE_SIZE]; // 缓冲区 +}wifi_spi_packets_struct; + + +extern char wifi_spi_version[12]; // 固件版本 字符串 +extern char wifi_spi_mac_addr[20]; // 模块MAC地址 字符串 +extern char wifi_spi_ip_addr_port[25]; // IP地址与端口号 字符串 -typedef struct -{ - uint8 version[12]; // 固件版本 字符串形式 - uint8 mac[20]; // 本机 MAC 地址 字符串形式 - uint8 local_ip[17]; // 本机 IP 地址 字符串形式 - uint8 local_port[10]; // 本机端口号 字符串形式 - uint8 remote_ip[5][17]; // 远端 IP 地址 字符串形式 - wifi_spi_mode_enum mode; // WIFI 模式 - wifi_spi_transfer_mode_enum transfer_mode; // 当前传输模式 - wifi_spi_connect_mode_enum connect_mode; // 网络连接模式 - wifi_spi_connect_state_enum connect_state; // 服务器连接情况 -}wifi_spi_information_struct; +uint8 wifi_spi_wifi_connect (char *wifi_ssid, char *pass_word); +uint8 wifi_spi_socket_connect (char *transport_type, char *ip_addr, char *port, char *local_port); +uint8 wifi_spi_socket_disconnect (void); +uint8 wifi_spi_udp_send_now (void); +uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 length); +uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 length); -typedef struct -{ - uint8 *source[WIFI_SPI_MAX_MULTI]; - uint16 length[WIFI_SPI_MAX_MULTI]; -}wifi_spi_send_multi_struct; - -extern wifi_spi_information_struct wifi_spi_information; - - -uint8 wifi_spi_disconnected_wifi (void); // 断开 WIFI 连接 -uint8 wifi_spi_entry_serianet (void); // 打开透传模式 -uint8 wifi_spi_exit_serianet (void); // 关闭透传模式 - -uint8 wifi_spi_connect_tcp_servers (char *ip, char *port, wifi_spi_transfer_mode_enum mode); // 建立 TCP 连接 -uint8 wifi_spi_connect_udp_client (char *ip, char *port, char *local_port, wifi_spi_transfer_mode_enum mode); // 建立 UDP 传输 -uint8 wifi_spi_disconnect_link (void); // 断开连接 TCP Server 使用本接口将会断开所有连接 - -uint32 wifi_spi_send_byte (uint8 data); // WIFI 模块发送字节函数 -uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 length); // WIFI 模块发送缓冲区函数 -uint32 wifi_spi_send_buffer_multi (wifi_spi_send_multi_struct *multi_buffer); // WIFI 模块发送多缓冲区函数 -uint32 wifi_spi_send_string (const char *str); // WIFI 模块发送字符串函数 - -uint32 wifi_spi_read_buffer (uint8 *buff, uint32 len); // WIFI 模块数据接收函数 - -uint8 wifi_spi_init (char *wifi_ssid, char *pass_word, wifi_spi_mode_enum wifi_mode); // WIFI 模块初始化函数 +uint8 wifi_spi_init (char *wifi_ssid, char *pass_word); #endif + diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_wifi_uart.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_wifi_uart.c index 312dab7..ff728bb 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_wifi_uart.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_wifi_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_wifi_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -61,7 +61,7 @@ wifi_uart_information_struct wifi_uart_information; // 模块自身参数 -static fifo_obj_struct wifi_uart_fifo; +static fifo_struct wifi_uart_fifo; static uint8 wifi_uart_buffer[WIFI_UART_BUFFER_SIZE]; // 数据存放数组 static uint8 wifi_uart_data; diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_wifi_uart.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_wifi_uart.h index abcb253..3316b6f 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_wifi_uart.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_wifi_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_wifi_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_wireless_uart.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_wireless_uart.c index eac2867..91ec013 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_wireless_uart.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_wireless_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_wireless_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -53,7 +53,7 @@ #include "zf_device_type.h" #include "zf_device_wireless_uart.h" -static fifo_obj_struct wireless_uart_fifo; +static fifo_struct wireless_uart_fifo; static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; static uint8 wireless_uart_data = 0; diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_wireless_uart.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_wireless_uart.h index 2418545..a789ad0 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_wireless_uart.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_wireless_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_wireless_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -61,11 +61,11 @@ // 注意事项2:开启自动波特率务必连接RTS引脚 否则会开启失败。 // 注意事项3:模块自动波特率失败的话 可以尝试断电重启 -// 开启自动波特率务必阅读上面两条 注意事项 -// 开启自动波特率务必阅读上面两条 注意事项 -// 开启自动波特率务必阅读上面两条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 -// 0:关闭自动波特率 +// 0:关闭自动波特率 // 1:开启自动波特率 自动波特率的作用是修改 WIRELESS_UART_BAUD 之后不需要对模块进行配置 模块会自动设置为对应的波特率 #define WIRELESS_UART_AUTO_BAUD_RATE ( 1 ) diff --git a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_adc.c b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_adc.c index 9a262a1..06694d8 100644 --- a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_adc.c +++ b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_adc.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_adc * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_adc.h b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_adc.h index 378b67e..f017c76 100644 --- a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_adc.h +++ b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_adc.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_adc * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_delay.c b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_delay.c index 4ec533c..ae3e610 100644 --- a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_delay.c +++ b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_delay.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_delay * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_delay.h b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_delay.h index e8d82ef..7b8b475 100644 --- a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_delay.h +++ b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_delay.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_delay * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_dma.c b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_dma.c index f72f1d6..43bffbc 100644 --- a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_dma.c +++ b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_dma.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_dma * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_dma.h b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_dma.h index 1ec555b..320d40c 100644 --- a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_dma.h +++ b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_dma.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_dma * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_encoder.c b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_encoder.c index 6592198..0e0e0b9 100644 --- a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_encoder.c +++ b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_encoder.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_encoder.h b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_encoder.h index 68d159f..e079122 100644 --- a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_encoder.h +++ b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_encoder.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_exti.c b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_exti.c index 72c9a1f..31d270a 100644 --- a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_exti.c +++ b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_exti.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_exti * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_exti.h b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_exti.h index 30f5ef6..b63f9ee 100644 --- a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_exti.h +++ b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_exti.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_exti * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_flash.c b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_flash.c index f91f5a0..325cfed 100644 --- a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_flash.c +++ b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_flash.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_flash * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_flash.h b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_flash.h index 912585a..e7425fd 100644 --- a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_flash.h +++ b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_flash.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_flash * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_gpio.c b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_gpio.c index 5071114..a084353 100644 --- a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_gpio.c +++ b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_gpio.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_gpio * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_gpio.h b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_gpio.h index 2b23be0..550fb8d 100644 --- a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_gpio.h +++ b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_gpio.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_gpio * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_pit.c b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_pit.c index c4dc50d..5e03d38 100644 --- a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_pit.c +++ b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_pit.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pit * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_pit.h b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_pit.h index 5461e05..66854b5 100644 --- a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_pit.h +++ b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_pit.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pit * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_pwm.c b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_pwm.c index ad1059a..24d8d7a 100644 --- a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_pwm.c +++ b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_pwm.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pwm * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_pwm.h b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_pwm.h index d6dce78..51948a4 100644 --- a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_pwm.h +++ b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_pwm.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pwm * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_soft_iic.c b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_soft_iic.c index 9833b62..a349ec7 100644 --- a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_soft_iic.c +++ b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_soft_iic.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_iic * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_soft_iic.h b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_soft_iic.h index a62b262..80db53b 100644 --- a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_soft_iic.h +++ b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_soft_iic.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_iic * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_soft_spi.c b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_soft_spi.c index 292c60b..954fbe3 100644 --- a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_soft_spi.c +++ b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_soft_spi.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_soft_spi.h b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_soft_spi.h index 6a9c207..62858de 100644 --- a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_soft_spi.h +++ b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_soft_spi.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_spi.c b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_spi.c index 1b99196..f817dd9 100644 --- a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_spi.c +++ b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_spi.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -920,7 +920,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 do { - IfxQspi_writeTransmitFifo(moudle, (uint8)(*write_buffer & 0xFF00) >> 8); // 将发送的数据写入缓冲区 + IfxQspi_writeTransmitFifo(moudle, (uint8)((*write_buffer & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 if(read_buffer != NULL) { diff --git a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_spi.h b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_spi.h index e73507e..d15589c 100644 --- a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_spi.h +++ b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_spi.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_timer.c b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_timer.c index a953b92..e085d6e 100644 --- a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_timer.c +++ b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_timer.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_timer * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_timer.h b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_timer.h index 3c86f58..1bb348f 100644 --- a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_timer.h +++ b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_timer.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_timer * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_uart.c b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_uart.c index cd19782..fb89b55 100644 --- a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_uart.c +++ b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_uart.h b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_uart.h index 8d1d111..cdc55ab 100644 --- a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_uart.h +++ b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E06_exit_demo/user/isr.c b/Example/E06_exit_demo/user/isr.c index 606b16a..6c26b9e 100644 --- a/Example/E06_exit_demo/user/isr.c +++ b/Example/E06_exit_demo/user/isr.c @@ -24,7 +24,7 @@ * 文件名称 isr * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -118,7 +118,7 @@ IFX_INTERRUPT(cc61_pit_ch1_isr, 0, CCU6_1_CH1_ISR_PRIORITY) // { // exti_flag_clear(ERU_CH5_REQ1_P15_8); // -// wireless_module_spi_handler(); // SPI WIFI 中断回调函数 +// // // } //} diff --git a/Example/E07_encoder_demo/libraries/doc/version.txt b/Example/E07_encoder_demo/libraries/doc/version.txt index b841b50..d644136 100644 --- a/Example/E07_encoder_demo/libraries/doc/version.txt +++ b/Example/E07_encoder_demo/libraries/doc/version.txt @@ -1,3 +1,8 @@ +V3.2.6 + 更新逐飞助手接口函数 调用初始化时直接传参通信类 + 更新wifi SPI驱动文件 提高通信效率 + 更新GPS驱动文件,更名为GNSS,兼容普通定位模块及RTK + V3.2.5 修复延时函数初始化参数及中断向量表问题 V3.2.4 diff --git a/Example/E07_encoder_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h b/Example/E07_encoder_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h index 28ff689..371e6b6 100644 --- a/Example/E07_encoder_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h +++ b/Example/E07_encoder_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h @@ -34,7 +34,7 @@ /*------------------------------------------Configuration for IfxScu_cfg.h-------------------------------------------*/ /*********************************************************************************************************************/ /* External oscillator frequency in Hz */ -#define IFX_CFG_SCU_XTAL_FREQUENCY (20000000) /* Allowed values are: 16000000, 20000000 or 40000000 */ +#define IFX_CFG_SCU_XTAL_FREQUENCY (20000000) /* Allowed values are9p: 16000000, 20000000 or 40000000 */ /* PLL frequency in Hz */ #define IFX_CFG_SCU_PLL_FREQUENCY (200000000) /* Allowed values are: 80000000, 133000000, 160000000 * or 200000000 */ diff --git a/Example/E07_encoder_demo/libraries/zf_common/zf_common_clock.c b/Example/E07_encoder_demo/libraries/zf_common/zf_common_clock.c index 5023270..9872ea9 100644 --- a/Example/E07_encoder_demo/libraries/zf_common/zf_common_clock.c +++ b/Example/E07_encoder_demo/libraries/zf_common/zf_common_clock.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_clock * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_common/zf_common_clock.h b/Example/E07_encoder_demo/libraries/zf_common/zf_common_clock.h index 9face65..2b50396 100644 --- a/Example/E07_encoder_demo/libraries/zf_common/zf_common_clock.h +++ b/Example/E07_encoder_demo/libraries/zf_common/zf_common_clock.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_clock * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_common/zf_common_debug.c b/Example/E07_encoder_demo/libraries/zf_common/zf_common_debug.c index 52c623d..d680265 100644 --- a/Example/E07_encoder_demo/libraries/zf_common/zf_common_debug.c +++ b/Example/E07_encoder_demo/libraries/zf_common/zf_common_debug.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_debug * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -46,7 +46,7 @@ static volatile uint8 zf_debug_assert_enable = 1; #if DEBUG_UART_USE_INTERRUPT // 如果启用 debug uart 接收中断 uint8 debug_uart_buffer[DEBUG_RING_BUFFER_LEN]; // 数据存放数组 uint8 debug_uart_data; -fifo_obj_struct debug_uart_fifo; +fifo_struct debug_uart_fifo; #endif //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E07_encoder_demo/libraries/zf_common/zf_common_debug.h b/Example/E07_encoder_demo/libraries/zf_common/zf_common_debug.h index 881a297..4fb4d91 100644 --- a/Example/E07_encoder_demo/libraries/zf_common/zf_common_debug.h +++ b/Example/E07_encoder_demo/libraries/zf_common/zf_common_debug.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_debug * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_common/zf_common_fifo.c b/Example/E07_encoder_demo/libraries/zf_common/zf_common_fifo.c index b010d3e..94f5133 100644 --- a/Example/E07_encoder_demo/libraries/zf_common/zf_common_fifo.c +++ b/Example/E07_encoder_demo/libraries/zf_common/zf_common_fifo.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_fifo * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -45,7 +45,7 @@ // 使用示例 fifo_head_offset(fifo, 1); // 备注信息 本函数在文件内部调用 用户不用关注 也不可修改 //------------------------------------------------------------------------------------------------------------------- -static void fifo_head_offset (fifo_obj_struct *fifo, uint32 offset) +static void fifo_head_offset (fifo_struct *fifo, uint32 offset) { fifo->head += offset; @@ -63,7 +63,7 @@ static void fifo_head_offset (fifo_obj_struct *fifo, uint32 offset) // 使用示例 fifo_end_offset(fifo, 1); // 备注信息 本函数在文件内部调用 用户不用关注 也不可修改 //------------------------------------------------------------------------------------------------------------------- -static void fifo_end_offset (fifo_obj_struct *fifo, uint32 offset) +static void fifo_end_offset (fifo_struct *fifo, uint32 offset) { fifo->end += offset; @@ -80,7 +80,7 @@ static void fifo_end_offset (fifo_obj_struct *fifo, uint32 offset) // 使用示例 fifo_clear(fifo); // 备注信息 清空当前 FIFO 对象的内存 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_clear (fifo_obj_struct *fifo) +fifo_state_enum fifo_clear (fifo_struct *fifo) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -113,7 +113,7 @@ fifo_state_enum fifo_clear (fifo_obj_struct *fifo) // 使用示例 uint32 len = fifo_used(fifo); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 fifo_used (fifo_obj_struct *fifo) +uint32 fifo_used (fifo_struct *fifo) { zf_assert(fifo != NULL); return (fifo->max - fifo->size); // 返回当前 FIFO 缓冲区中数据个数 @@ -127,7 +127,7 @@ uint32 fifo_used (fifo_obj_struct *fifo) // 使用示例 zf_log(fifo_write_element(&fifo, data) == FIFO_SUCCESS, "fifo_write_byte error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat) +fifo_state_enum fifo_write_element (fifo_struct *fifo, uint32 dat) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -171,7 +171,7 @@ fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat) // 使用示例 zf_log(fifo_write_buffer(&fifo, data, 32) == FIFO_SUCCESS, "fifo_write_buffer error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 length) +fifo_state_enum fifo_write_buffer (fifo_struct *fifo, void *dat, uint32 length) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -286,7 +286,7 @@ fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 leng // 使用示例 zf_log(fifo_read_element(&fifo, data, FIFO_READ_ONLY) == FIFO_SUCCESS, "fifo_read_byte error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operation_enum flag) +fifo_state_enum fifo_read_element (fifo_struct *fifo, void *dat, fifo_operation_enum flag) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -348,7 +348,7 @@ fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operat // 使用示例 zf_log(fifo_read_buffer(&fifo, data, &length, FIFO_READ_ONLY) == FIFO_SUCCESS, "fifo_read_buffer error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) +fifo_state_enum fifo_read_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) { zf_assert(NULL != fifo); zf_assert(NULL != length); @@ -447,7 +447,7 @@ fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *leng // 如果使用 FIFO_READ_AND_CLEAN 操作 将会丢弃所有数据并清空整个 FIFO // 如果使用 FIFO_READ_AND_CLEAN 操作 将会丢弃所有数据并清空整个 FIFO //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) +fifo_state_enum fifo_read_tail_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) { zf_assert(NULL != fifo); zf_assert(NULL != length); @@ -541,7 +541,7 @@ fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 // 使用示例 fifo_init(&user_fifo, user_buffer, 64); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_init (fifo_obj_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size) +fifo_state_enum fifo_init (fifo_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; diff --git a/Example/E07_encoder_demo/libraries/zf_common/zf_common_fifo.h b/Example/E07_encoder_demo/libraries/zf_common/zf_common_fifo.h index 5cc7668..901a913 100644 --- a/Example/E07_encoder_demo/libraries/zf_common/zf_common_fifo.h +++ b/Example/E07_encoder_demo/libraries/zf_common/zf_common_fifo.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_fifo * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -91,17 +91,17 @@ typedef struct uint32 end; // 缓存尾指针 总是指向非空缓存(缓存全空除外) uint32 size; // 缓存剩余大小 uint32 max; // 缓存总大小 -}fifo_obj_struct; +}fifo_struct; -fifo_state_enum fifo_clear (fifo_obj_struct *fifo); -uint32 fifo_used (fifo_obj_struct *fifo); +fifo_state_enum fifo_clear (fifo_struct *fifo); +uint32 fifo_used (fifo_struct *fifo); -fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat); -fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 length); -fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operation_enum flag); -fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); -fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); +fifo_state_enum fifo_write_element (fifo_struct *fifo, uint32 dat); +fifo_state_enum fifo_write_buffer (fifo_struct *fifo, void *dat, uint32 length); +fifo_state_enum fifo_read_element (fifo_struct *fifo, void *dat, fifo_operation_enum flag); +fifo_state_enum fifo_read_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); +fifo_state_enum fifo_read_tail_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); -fifo_state_enum fifo_init (fifo_obj_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size); +fifo_state_enum fifo_init (fifo_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size); #endif diff --git a/Example/E07_encoder_demo/libraries/zf_common/zf_common_font.c b/Example/E07_encoder_demo/libraries/zf_common/zf_common_font.c index c816f9d..ee1df09 100644 --- a/Example/E07_encoder_demo/libraries/zf_common/zf_common_font.c +++ b/Example/E07_encoder_demo/libraries/zf_common/zf_common_font.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_font * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_common/zf_common_font.h b/Example/E07_encoder_demo/libraries/zf_common/zf_common_font.h index 24b8602..7531250 100644 --- a/Example/E07_encoder_demo/libraries/zf_common/zf_common_font.h +++ b/Example/E07_encoder_demo/libraries/zf_common/zf_common_font.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_font * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_common/zf_common_function.c b/Example/E07_encoder_demo/libraries/zf_common/zf_common_function.c index d403fb5..acf2739 100644 --- a/Example/E07_encoder_demo/libraries/zf_common/zf_common_function.c +++ b/Example/E07_encoder_demo/libraries/zf_common/zf_common_function.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_function * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_common/zf_common_function.h b/Example/E07_encoder_demo/libraries/zf_common/zf_common_function.h index f5683e1..101b58a 100644 --- a/Example/E07_encoder_demo/libraries/zf_common/zf_common_function.h +++ b/Example/E07_encoder_demo/libraries/zf_common/zf_common_function.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_function * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_common/zf_common_headfile.h b/Example/E07_encoder_demo/libraries/zf_common/zf_common_headfile.h index aa06ef8..86762db 100644 --- a/Example/E07_encoder_demo/libraries/zf_common/zf_common_headfile.h +++ b/Example/E07_encoder_demo/libraries/zf_common/zf_common_headfile.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_headfile * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -82,7 +82,7 @@ //===================================================外接设备驱动层=================================================== #include "zf_device_absolute_encoder.h" #include "zf_device_bluetooth_ch9141.h" -#include "zf_device_gps_tau1201.h" +#include "zf_device_gnss.h" #include "zf_device_camera.h" #include "zf_device_dl1a.h" #include "zf_device_dl1b.h" @@ -108,6 +108,7 @@ //====================================================应用组件层==================================================== #include "seekfree_assistant.h" +#include "seekfree_assistant_interface.h" //====================================================应用组件层==================================================== //=====================================================用户层====================================================== diff --git a/Example/E07_encoder_demo/libraries/zf_common/zf_common_interrupt.c b/Example/E07_encoder_demo/libraries/zf_common/zf_common_interrupt.c index 61058b2..af12fe0 100644 --- a/Example/E07_encoder_demo/libraries/zf_common/zf_common_interrupt.c +++ b/Example/E07_encoder_demo/libraries/zf_common/zf_common_interrupt.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_interrupt * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_common/zf_common_interrupt.h b/Example/E07_encoder_demo/libraries/zf_common/zf_common_interrupt.h index 99b0e53..f828423 100644 --- a/Example/E07_encoder_demo/libraries/zf_common/zf_common_interrupt.h +++ b/Example/E07_encoder_demo/libraries/zf_common/zf_common_interrupt.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_interrupt * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_common/zf_common_typedef.h b/Example/E07_encoder_demo/libraries/zf_common/zf_common_typedef.h index bd09f30..9a07c92 100644 --- a/Example/E07_encoder_demo/libraries/zf_common/zf_common_typedef.h +++ b/Example/E07_encoder_demo/libraries/zf_common/zf_common_typedef.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_typedef * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_components/seekfree_assistant.c b/Example/E07_encoder_demo/libraries/zf_components/seekfree_assistant.c index a196e10..0b7cb9d 100644 --- a/Example/E07_encoder_demo/libraries/zf_components/seekfree_assistant.c +++ b/Example/E07_encoder_demo/libraries/zf_components/seekfree_assistant.c @@ -1,49 +1,71 @@ /********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ -#include "zf_common_fifo.h" + +#include "zf_common_debug.h" + #include "seekfree_assistant.h" -seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 -static seekfree_assistant_camera_struct seekfree_assistant_camera_data; // 图像上位机协议数据 -static seekfree_assistant_camera_dot_struct seekfree_assistant_camera_dot_data; // 图像上位机打点协议数据 -static seekfree_assistant_camera_buffer_struct seekfree_assistant_camera_buffer; // 图像以及边界缓冲区信息 -static fifo_obj_struct seekfree_assistant_fifo; -static uint8 seekfree_assistant_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE]; // 数据存放数组 -float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 保存接收到的参数 -vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 参数更新标志位 +extern uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length); +extern uint32 seekfree_assistant_receive (uint8 *buff, uint32 length); + +#if (1 == SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE) +#include "zf_common_fifo.h" +static uint8 seekfree_assistant_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE]; // FIFO缓冲区 +static fifo_struct seekfree_assistant_fifo = // FIFO结构体 +{ + .buffer = seekfree_assistant_buffer, + .execution = FIFO_IDLE, + .type = FIFO_DATA_8BIT, + .head = 0, + .end = 0, + .size = SEEKFREE_ASSISTANT_BUFFER_SIZE, + .max = SEEKFREE_ASSISTANT_BUFFER_SIZE, +}; +#endif + +static seekfree_assistant_camera_struct seekfree_assistant_camera_data; // 图像上位机协议数据 +static seekfree_assistant_camera_dot_struct seekfree_assistant_camera_dot_data; // 图像上位机打点协议数据 +static seekfree_assistant_camera_buffer_struct seekfree_assistant_camera_buffer; // 图像以及边界缓冲区信息 + +seekfree_assistant_transfer_callback_function seekfree_assistant_transfer_callback = seekfree_assistant_transfer; // 数据发送函数指针 +seekfree_assistant_receive_callback_function seekfree_assistant_receive_callback = seekfree_assistant_receive; // 数据接收函数指针 + +seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 +float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 保存接收到的参数 +vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 参数更新标志位 //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手求和函数 @@ -87,7 +109,7 @@ void seekfree_assistant_camera_data_send (seekfree_assistant_image_type_enum cam seekfree_assistant_camera_data.image_height = height; // 首先发送帧头、功能、摄像头类型、以及宽度高度等信息 - seekfree_assistant_transfer((const uint8 *)&seekfree_assistant_camera_data, sizeof(seekfree_assistant_camera_struct)); + seekfree_assistant_transfer_callback((const uint8 *)&seekfree_assistant_camera_data, sizeof(seekfree_assistant_camera_struct)); // 根据摄像头类型计算图像大小 switch(camera_type) @@ -111,9 +133,8 @@ void seekfree_assistant_camera_data_send (seekfree_assistant_image_type_enum cam // 发送图像数据 if(NULL != image_addr) { - seekfree_assistant_transfer(image_addr, image_size); + seekfree_assistant_transfer_callback(image_addr, image_size); } - } //------------------------------------------------------------------------------------------------------------------- @@ -139,16 +160,15 @@ void seekfree_assistant_camera_dot_send (seekfree_assistant_camera_buffer_struct dot_bytes *= 2; } - // 首先发送帧头、功能、边界编号、坐标长度、点个数 - seekfree_assistant_transfer((const uint8 *)&seekfree_assistant_camera_dot_data, sizeof(seekfree_assistant_camera_dot_struct)); + seekfree_assistant_transfer_callback((const uint8 *)&seekfree_assistant_camera_dot_data, sizeof(seekfree_assistant_camera_dot_struct)); for(i=0; i < SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY; i++) { // 判断是否发送横坐标数据 if(NULL != buffer->boundary_x[i]) { - seekfree_assistant_transfer((const uint8 *)buffer->boundary_x[i], dot_bytes); + seekfree_assistant_transfer_callback((const uint8 *)buffer->boundary_x[i], dot_bytes); } // 判断是否发送纵坐标数据 @@ -156,10 +176,9 @@ void seekfree_assistant_camera_dot_send (seekfree_assistant_camera_buffer_struct { // 如果没有纵坐标数据,则表示每一行只有一个边界 // 指定了横纵坐标数据,这种方式可以实现同一行多个边界的情况,例如搜线算法能够搜索出回弯。 - seekfree_assistant_transfer((const uint8 *)buffer->boundary_y[i], dot_bytes); + seekfree_assistant_transfer_callback((const uint8 *)buffer->boundary_y[i], dot_bytes); } } - } //------------------------------------------------------------------------------------------------------------------- @@ -193,7 +212,7 @@ void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struc // 数据在调用本函数之前,由用户将需要发送的数据写入seekfree_assistant_oscilloscope_data.data[] - seekfree_assistant_transfer((const uint8 *)seekfree_assistant_oscilloscope, packet_size); + seekfree_assistant_transfer_callback((const uint8 *)seekfree_assistant_oscilloscope, packet_size); } //------------------------------------------------------------------------------------------------------------------- @@ -364,12 +383,14 @@ void seekfree_assistant_camera_send (void) } } + //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手解析接收到的数据 // 参数说明 void // 返回参数 void // 使用示例 函数只需要放到周期运行的PIT中断或者主循环即可 //------------------------------------------------------------------------------------------------------------------- +#if (1 == SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE) void seekfree_assistant_data_analysis (void) { uint8 temp_sum; @@ -380,14 +401,13 @@ void seekfree_assistant_data_analysis (void) uint32 temp_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE / 4]; // 尝试读取数据, 如果不是自定义的传输方式则从接收回调中读取数据 - read_length = seekfree_assistant_receive((uint8 *)temp_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); + read_length = seekfree_assistant_receive_callback((uint8 *)temp_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); if(read_length) { // 将读取到的数据写入FIFO fifo_write_buffer(&seekfree_assistant_fifo, (uint8 *)temp_buffer, read_length); } - while(sizeof(seekfree_assistant_parameter_struct) <= fifo_used(&seekfree_assistant_fifo)) { read_length = sizeof(seekfree_assistant_parameter_struct); @@ -416,21 +436,11 @@ void seekfree_assistant_data_analysis (void) } } - // 丢弃无需使用的数据 fifo_read_buffer(&seekfree_assistant_fifo, (uint8 *)temp_buffer, &read_length, FIFO_READ_AND_CLEAN); } } - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 逐飞助手 初始化 -// 参数说明 -// 返回参数 void -// 使用示例 -//------------------------------------------------------------------------------------------------------------------- -ZF_WEAK void seekfree_assistant_init () -{ - fifo_init(&seekfree_assistant_fifo, FIFO_DATA_8BIT, seekfree_assistant_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); -} +#endif + diff --git a/Example/E07_encoder_demo/libraries/zf_components/seekfree_assistant.h b/Example/E07_encoder_demo/libraries/zf_components/seekfree_assistant.h index d02abb1..ae0f67c 100644 --- a/Example/E07_encoder_demo/libraries/zf_components/seekfree_assistant.h +++ b/Example/E07_encoder_demo/libraries/zf_components/seekfree_assistant.h @@ -1,69 +1,75 @@ -/*/********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +/********************************************************************************************************************* +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ #ifndef _seekfree_assistant_h_ #define _seekfree_assistant_h_ #include "zf_common_typedef.h" -#include "zf_common_debug.h" + + +// 1:使能参数调节的功能 0:关闭参数调节的功能 +#define SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE ( 1 ) + + // 定义接收FIFO大小 -#define SEEKFREE_ASSISTANT_BUFFER_SIZE ( 0x80 ) +#define SEEKFREE_ASSISTANT_BUFFER_SIZE ( 0x80 ) + +// 定义示波器的最大通道数量 +#define SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT ( 0x08 ) + +// 定义参数调试的最大通道数量 +#define SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT ( 0x08 ) + +// 定义图像边线最大数量 +#define SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY ( 0x08 ) + +// 单片机往上位机发送的帧头 +#define SEEKFREE_ASSISTANT_SEND_HEAD ( 0xAA ) + +// 摄像头类 +#define SEEKFREE_ASSISTANT_CAMERA_FUNCTION ( 0x02 ) +#define SEEKFREE_ASSISTANT_CAMERA_DOT_FUNCTION ( 0x03 ) +#define SEEKFREE_ASSISTANT_CAMERA_OSCILLOSCOPE ( 0x10 ) + +// 上位机往单片机发送的帧头 +#define SEEKFREE_ASSISTANT_RECEIVE_HEAD ( 0x55 ) + +// 参数设置类 +#define SEEKFREE_ASSISTANT_RECEIVE_SET_PARAMETER ( 0x20 ) -// 定义示波器的最大通道数量 -#define SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT ( 0x08 ) - -// 定义参数调试的最大通道数量 -#define SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT ( 0x08 ) - -// 定义图像边线最大数量 -#define SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY ( 0x08 ) - -// 单片机往上位机发送的帧头 -#define SEEKFREE_ASSISTANT_SEND_HEAD ( 0xAA ) - -// 摄像头类 -#define SEEKFREE_ASSISTANT_CAMERA_FUNCTION ( 0x02 ) -#define SEEKFREE_ASSISTANT_CAMERA_DOT_FUNCTION ( 0x03 ) -#define SEEKFREE_ASSISTANT_CAMERA_OSCILLOSCOPE ( 0x10 ) - -// 上位机往单片机发送的帧头 -#define SEEKFREE_ASSISTANT_RECEIVE_HEAD ( 0x55 ) - -// 参数设置类 -#define SEEKFREE_ASSISTANT_RECEIVE_SET_PARAMETER ( 0x20 ) // 摄像头类型枚举 typedef enum @@ -91,71 +97,69 @@ typedef enum typedef struct { - uint8 head; // 帧头 - uint8 channel_num; // 高四位为功能字 低四位为通道数量 - uint8 check_sum; // 和校验 - uint8 length; // 包长度 - float data[SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT]; // 通道数据 + uint8 head; // 帧头 + uint8 channel_num; // 高四位为功能字 低四位为通道数量 + uint8 check_sum; // 和校验 + uint8 length; // 包长度 + float data[SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT]; // 通道数据 }seekfree_assistant_oscilloscope_struct; typedef struct { - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 camera_type; // 低四位表示边界数量 第四位表示是否有图像数据 例如0x13:其中3表示一副图像有三条边界(通常是左边界、中线、右边界)、1表示没有图像数据 - uint8 length; // 包长度(仅包含协议部分) - uint16 image_width; // 图像宽度 - uint16 image_height; // 图像高度 -}seekfree_assistant_camera_struct; - - -typedef struct -{ - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 dot_type; // 点类型 BIT5:1:坐标是16位的 0:坐标是8位的 BIT7-BIT6:0:只有X坐标 1:只有Y坐标 2:X和Y坐标都有 BIT3-BIT0:边界数量 - uint8 length; // 包长度(仅包含协议部分) - uint16 dot_num; // 画点数量 - uint8 valid_flag; // 通道标识 - uint8 reserve; // 保留 -}seekfree_assistant_camera_dot_struct; - -typedef struct -{ - void *image_addr; // 摄像头地址 - uint16 width; // 图像宽度 - uint16 height; // 图像高度 - seekfree_assistant_image_type_enum camera_type; // 摄像头类型 - void *boundary_x[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界横坐标数组地址 - void *boundary_y[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界纵坐标数组地址 + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 camera_type; // 低四位表示边界数量 第四位表示是否有图像数据 例如0x13:其中3表示一副图像有三条边界(通常是左边界、中线、右边界)、1表示没有图像数据 + uint8 length; // 包长度(仅包含协议部分) + uint16 image_width; // 图像宽度 + uint16 image_height; // 图像高度 +}seekfree_assistant_camera_struct; + + +typedef struct +{ + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 dot_type; // 点类型 BIT5:1:坐标是16位的 0:坐标是8位的 BIT7-BIT6:0:只有X坐标 1:只有Y坐标 2:X和Y坐标都有 BIT3-BIT0:边界数量 + uint8 length; // 包长度(仅包含协议部分) + uint16 dot_num; // 画点数量 + uint8 valid_flag; // 通道标识 + uint8 reserve; // 保留 +}seekfree_assistant_camera_dot_struct; + +typedef struct +{ + void *image_addr; // 摄像头地址 + uint16 width; // 图像宽度 + uint16 height; // 图像高度 + seekfree_assistant_image_type_enum camera_type; // 摄像头类型 + void *boundary_x[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界横坐标数组地址 + void *boundary_y[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界纵坐标数组地址 }seekfree_assistant_camera_buffer_struct; typedef struct { - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 channel; // 通道 - uint8 check_sum; // 和校验 - float data; // 数据 + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 channel; // 通道 + uint8 check_sum; // 和校验 + float data; // 数据 }seekfree_assistant_parameter_struct; +typedef uint32 (*seekfree_assistant_transfer_callback_function) (const uint8 *buff, uint32 length); +typedef uint32 (*seekfree_assistant_receive_callback_function) (uint8 *buff, uint32 length); -extern seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 -extern float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 保存接收到的参数 -extern vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 参数更新标志位 +extern seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 +extern float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 保存接收到的参数 +extern vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 参数更新标志位 + + +void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struct *seekfree_assistant_oscilloscope); +void seekfree_assistant_camera_information_config (seekfree_assistant_image_type_enum camera_type, void *image_addr, uint16 width, uint16 height); +void seekfree_assistant_camera_boundary_config (seekfree_assistant_boundary_type_enum boundary_type, uint16 dot_num, void *dot_x1, void *dot_x2, void *dot_x3, void *dot_y1, void *dot_y2, void *dot_y3); +void seekfree_assistant_camera_send (void); +void seekfree_assistant_data_analysis (void); -uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length); -uint32 seekfree_assistant_receive (uint8 *buff, uint32 length); - -void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struct *seekfree_assistant_oscilloscope); - -void seekfree_assistant_camera_information_config (seekfree_assistant_image_type_enum camera_type, void *image_addr, uint16 width, uint16 height); -void seekfree_assistant_camera_boundary_config (seekfree_assistant_boundary_type_enum boundary_type, uint16 dot_num, void *dot_x1, void *dot_x2, void *dot_x3, void *dot_y1, void *dot_y2, void *dot_y3); -void seekfree_assistant_camera_send (void); - -void seekfree_assistant_data_analysis (void); -void seekfree_assistant_init (void); #endif diff --git a/Example/E07_encoder_demo/libraries/zf_components/seekfree_assistant_interface.c b/Example/E07_encoder_demo/libraries/zf_components/seekfree_assistant_interface.c index 99dbeef..fdade63 100644 --- a/Example/E07_encoder_demo/libraries/zf_components/seekfree_assistant_interface.c +++ b/Example/E07_encoder_demo/libraries/zf_components/seekfree_assistant_interface.c @@ -1,42 +1,55 @@ /********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant_interface * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ #include "zf_common_typedef.h" +#include "zf_common_fifo.h" #include "zf_common_debug.h" +#include "zf_driver_uart.h" +#include "zf_device_wireless_uart.h" +#include "zf_device_bluetooth_ch9141.h" +#include "zf_device_wifi_uart.h" +#include "zf_device_wifi_spi.h" #include "seekfree_assistant.h" +#include "seekfree_assistant_interface.h" + + +extern seekfree_assistant_transfer_callback_function seekfree_assistant_transfer_callback; // 数据发送函数指针 +extern seekfree_assistant_receive_callback_function seekfree_assistant_receive_callback; // 数据接收函数指针 + + //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手发送函数 // 参数说明 *buff 需要发送的数据地址 @@ -46,11 +59,9 @@ //------------------------------------------------------------------------------------------------------------------- ZF_WEAK uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length) { - uint32 len = 0; - - len = debug_send_buffer(buff, length); - - return len; + + // 当选择自定义通讯方式时 需要自行完成数据发送功能 + return length; } //------------------------------------------------------------------------------------------------------------------- @@ -62,11 +73,57 @@ ZF_WEAK uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length) //------------------------------------------------------------------------------------------------------------------- ZF_WEAK uint32 seekfree_assistant_receive (uint8 *buff, uint32 length) { - uint32 len = 0; + // 当选择自定义通讯方式时 需要自行完成数据接收功能 + return 0; +} - len = debug_read_ring_buffer(buff, length); - - return len; +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 逐飞助手接口 初始化 +// 参数说明 +// 返回参数 void +// 使用示例 seekfree_assistant_interface_init(SEEKFREE_ASSISTANT_WIFI_SPI); 使用高速WIFI SPI模块进行数据收发 +// 备注 需要自行调用设备的初始化,例如使用无线转串口进行数据的收发,则需要自行调用无线转串口的初始化,然后再调用seekfree_assistant_interface_init完成逐飞助手的接口初始化 +//------------------------------------------------------------------------------------------------------------------- +ZF_WEAK void seekfree_assistant_interface_init (seekfree_assistant_transfer_device_enum transfer_device) +{ + switch(transfer_device) + { + case SEEKFREE_ASSISTANT_DEBUG_UART: + { + seekfree_assistant_transfer_callback = debug_send_buffer; + seekfree_assistant_receive_callback = debug_read_ring_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIRELESS_UART: + { + seekfree_assistant_transfer_callback = wireless_uart_send_buffer; + seekfree_assistant_receive_callback = wireless_uart_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_CH9141: + { + seekfree_assistant_transfer_callback = bluetooth_ch9141_send_buffer; + seekfree_assistant_receive_callback = bluetooth_ch9141_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIFI_UART: + { + seekfree_assistant_transfer_callback = wifi_uart_send_buffer; + seekfree_assistant_receive_callback = wifi_uart_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIFI_SPI: + { + seekfree_assistant_transfer_callback = wifi_spi_send_buffer; + seekfree_assistant_receive_callback = wifi_spi_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_CUSTOM: + { + // 根据自己的需求 自行实现seekfree_assistant_transfer与seekfree_assistant_receive函数,完成数据的收发 + + }break; + } } diff --git a/Example/E07_encoder_demo/libraries/zf_components/seekfree_assistant_interface.h b/Example/E07_encoder_demo/libraries/zf_components/seekfree_assistant_interface.h new file mode 100644 index 0000000..940b5f7 --- /dev/null +++ b/Example/E07_encoder_demo/libraries/zf_components/seekfree_assistant_interface.h @@ -0,0 +1,57 @@ +/********************************************************************************************************************* +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 +* Copyright (c) 2022 SEEKFREE 逐飞科技 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 +* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 +* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 +* +* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 +* 甚至没有隐含的适销性或适合特定用途的保证 +* 更多细节请参见 GPL +* +* 您应该在收到本开源库的同时收到一份 GPL 的副本 +* 如果没有,请参阅 +* +* 额外注明: +* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 +* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 +* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 +* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) +* +* 文件名称 seekfree_assistant_interface +* 公司名称 成都逐飞科技有限公司 +* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A +* 店铺链接 https://seekfree.taobao.com/ +* +* 修改记录 +* 日期 作者 备注 +* 2024-1-11 SeekFree first version +********************************************************************************************************************/ + +#ifndef _seekfree_assistant_interface_h_ +#define _seekfree_assistant_interface_h_ + + + +// 数据发送设备枚举 +typedef enum +{ + SEEKFREE_ASSISTANT_DEBUG_UART, // 调试串口 使用的串口由DEBUG_UART_INDEX宏定义指定 + SEEKFREE_ASSISTANT_WIRELESS_UART, // 无线转串口 + SEEKFREE_ASSISTANT_CH9141, // CH9141蓝牙 + SEEKFREE_ASSISTANT_WIFI_UART, // WIFI转串口 + SEEKFREE_ASSISTANT_WIFI_SPI, // 高速WIFI SPI + SEEKFREE_ASSISTANT_CUSTOM, // 自定义通讯方式 需要自行seekfree_assistant_transfer与seekfree_assistant_receive函数 +}seekfree_assistant_transfer_device_enum; + + +void seekfree_assistant_interface_init (seekfree_assistant_transfer_device_enum transfer_device); + + + +#endif diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_absolute_encoder.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_absolute_encoder.c index 7c80a3b..f9bc809 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_absolute_encoder.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_absolute_encoder.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_absolute_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_absolute_encoder.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_absolute_encoder.h index e6cc057..ed92906 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_absolute_encoder.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_absolute_encoder.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_absolute_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c index 500bccb..b0a06df 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_bluetooth_ch9141 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -54,7 +54,7 @@ #include "zf_device_camera.h" #include "zf_device_bluetooth_ch9141.h" -static fifo_obj_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 +static fifo_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 static uint8 bluetooth_ch9141_buffer[BLUETOOTH_CH9141_BUFFER_SIZE]; // 数据存放数组 static uint8 bluetooth_ch9141_data = 0; // 数据临时存放变量 diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h index 800be6c..ffb30b5 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h @@ -24,7 +24,7 @@ * 文件名称 main * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_camera.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_camera.c index 84c7aa0..68668c4 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_camera.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_camera.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_camera * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -45,7 +45,7 @@ #include "zf_device_camera.h" -fifo_obj_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 +fifo_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; // 定义摄像头接收数据缓冲区 uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // 定义摄像头数据发送到上位机的帧头 diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_camera.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_camera.h index 58efb06..2cd7d2d 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_camera.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_camera.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_camera * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -44,7 +44,7 @@ //=================================================摄像头公共库 基本配置================================================ #define CAMERA_RECEIVER_BUFFER_SIZE (8) // 定义摄像头接收数据缓冲区大小 -extern fifo_obj_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 +extern fifo_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 extern uint8 camera_send_image_frame_header[4]; // 声明摄像头数据发送到上位机的帧头 //=================================================摄像头公共库 基本配置================================================ diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_config.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_config.h index af6a3d8..6c8147d 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_config.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_config.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_config * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_dl1a.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_dl1a.c index 3e7410c..27be3a7 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_dl1a.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_dl1a.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1a * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_dl1a.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_dl1a.h index 89145d3..3176dd3 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_dl1a.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_dl1a.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1a * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_dl1b.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_dl1b.c index 90e64b3..96e472e 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_dl1b.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_dl1b.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1b * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_dl1b.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_dl1b.h index b144739..922b3ce 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_dl1b.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_dl1b.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1b * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_gnss.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_gnss.c new file mode 100644 index 0000000..caf7cd0 --- /dev/null +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_gnss.c @@ -0,0 +1,620 @@ +/********************************************************************************************************************* +* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* Copyright (c) 2022 SEEKFREE 逐飞科技 +* +* 本文件是 TC264 开源库的一部分 +* +* TC264 开源库 是免费软件 +* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 +* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 +* +* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 +* 甚至没有隐含的适销性或适合特定用途的保证 +* 更多细节请参见 GPL +* +* 您应该在收到本开源库的同时收到一份 GPL 的副本 +* 如果没有,请参阅 +* +* 额外注明: +* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 +* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 +* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 +* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) +* +* 文件名称 zf_device_gnss +* 公司名称 成都逐飞科技有限公司 +* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 +* 开发环境 ADS v1.9.20 +* 适用平台 TC264D +* 店铺链接 https://seekfree.taobao.com/ +* +* 修改记录 +* 日期 作者 备注 +* 2023-12-28 pudding first version +********************************************************************************************************************/ +/********************************************************************************************************************* +* 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* RX 查看 zf_device_gnss.h 中 GNSS_RX 宏定义 +* TX 查看 zf_device_gnss.h 中 GNSS_TX 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* ------------------------------------ +********************************************************************************************************************/ + +#include "math.h" +#include "zf_common_function.h" +#include "zf_common_fifo.h" +#include "zf_driver_delay.h" +#include "zf_driver_uart.h" + +#include "zf_device_gnss.h" + +#define GNSS_BUFFER_SIZE ( 128 ) + +uint8 gnss_flag = 0; // 1:采集完成等待处理数据 0:没有采集完成 +gnss_info_struct gnss; // GPS解析之后的数据 + +static uint8 gnss_state = 0; // 1:GPS初始化完成 +static fifo_struct gnss_receiver_fifo; // +static uint8 gnss_receiver_buffer[GNSS_BUFFER_SIZE]; // 数据存放数组 + +static gps_state_enum gnss_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 +static gps_state_enum gnss_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 +static gps_state_enum gnss_ths_state = GPS_STATE_RECEIVING; // rmc 语句状态 + +static uint8 gps_gga_buffer[GNSS_BUFFER_SIZE]; +static uint8 gps_rmc_buffer[GNSS_BUFFER_SIZE]; +static uint8 gps_ths_buffer[GNSS_BUFFER_SIZE]; + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 获取指定 ',' 后面的索引 +// 参数说明 num 第几个逗号 +// 参数说明 *str 字符串 +// 返回参数 uint8 返回索引 +// 使用示例 get_parameter_index(1, s); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 get_parameter_index (uint8 num, char *str) +{ + uint8 i = 0, j = 0; + char *temp = strchr(str, '\n'); + uint8 len = 0, len1 = 0; + + 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; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 给定字符串第一个 ',' 之前的数据转换为int +// 参数说明 *s 字符串 +// 返回参数 float 返回数值 +// 使用示例 get_int_number(&buf[get_parameter_index(7, buf)]); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static int get_int_number (char *s) +{ + char buf[10]; + uint8 i = 0; + int return_value = 0; + i = get_parameter_index(1, s); + i = i - 1; + strncpy(buf, s, i); + buf[i] = 0; + return_value = func_str_to_int(buf); + return return_value; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 给定字符串第一个 ',' 之前的数据转换为float +// 参数说明 *s 字符串 +// 返回参数 float 返回数值 +// 使用示例 get_float_number(&buf[get_parameter_index(8, buf)]); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static float get_float_number (char *s) +{ + uint8 i = 0; + char buf[15]; + float return_value = 0; + + i = get_parameter_index(1, s); + i = i - 1; + strncpy(buf, s, i); + buf[i] = 0; + return_value = (float)func_str_to_double(buf); + return return_value; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 给定字符串第一个 ',' 之前的数据转换为double +// 参数说明 *s 字符串 +// 返回参数 double 返回数值 +// 使用示例 get_double_number(&buf[get_parameter_index(3, buf)]); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static double get_double_number (char *s) +{ + uint8 i = 0; + char buf[15]; + double return_value = 0; + + i = get_parameter_index(1, s); + i = i - 1; + strncpy(buf, s, i); + buf[i] = 0; + return_value = func_str_to_double(buf); + return return_value; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 世界时间转换为北京时间 +// 参数说明 *time 保存的时间 +// 返回参数 void +// 使用示例 utc_to_btc(&gnss->time); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static void utc_to_btc (gps_time_struct *time) +{ + uint8 day_num = 0; + + time->hour = time->hour + 8; + if(23 < time->hour) + { + time->hour -= 24; + time->day += 1; + + if(2 == time->month) + { + day_num = 28; + if((0 == time->year % 4 && 0 != time->year % 100) || 0 == time->year % 400) // 判断是否为闰年 + { + day_num ++; // 闰月 2月为29天 + } + } + else + { + day_num = 31; // 1 3 5 7 8 10 12这些月份为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(12 < time->month) + { + time->month -= 12; + time->year ++; + } + } + } +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 RMC语句解析 +// 参数说明 *line 接收到的语句信息 +// 参数说明 *gnss 保存解析后的数据 +// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 +// 使用示例 gps_gnrmc_parse((char *)data_buffer, &gnss); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 gps_gnrmc_parse (char *line, gnss_info_struct *gnss) +{ + uint8 state = 0, temp = 0; + + double latitude = 0; // 纬度 + double longitude = 0; // 经度 + + double lati_cent_tmp = 0, lati_second_tmp = 0; + double long_cent_tmp = 0, long_second_tmp = 0; + float speed_tmp = 0; + char *buf = line; + uint8 return_state = 0; + + state = buf[get_parameter_index(2, buf)]; + + if('A' == state) // 如果数据有效 则解析数据 + { + return_state = 1; + gnss->state = 1; + gnss -> ns = buf[get_parameter_index(4, buf)]; + gnss -> 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)]); + + gnss->latitude_degree = (int)latitude / 100; // 纬度转换为度分秒 + lati_cent_tmp = (latitude - gnss->latitude_degree * 100); + gnss->latitude_cent = (int)lati_cent_tmp; + lati_second_tmp = (lati_cent_tmp - gnss->latitude_cent) * 6000; + gnss->latitude_second = (int)lati_second_tmp; + + gnss->longitude_degree = (int)longitude / 100; // 经度转换为度分秒 + long_cent_tmp = (longitude - gnss->longitude_degree * 100); + gnss->longitude_cent = (int)long_cent_tmp; + long_second_tmp = (long_cent_tmp - gnss->longitude_cent) * 6000; + gnss->longitude_second = (int)long_second_tmp; + + gnss->latitude = gnss->latitude_degree + lati_cent_tmp / 60; + gnss->longitude = gnss->longitude_degree + long_cent_tmp / 60; + + speed_tmp = get_float_number(&buf[get_parameter_index(7, buf)]); // 速度(海里/小时) + gnss->speed = speed_tmp * 1.85f; // 转换为公里/小时 + gnss->direction = get_float_number(&buf[get_parameter_index(8, buf)]); // 角度 + } + else + { + gnss->state = 0; + } + + // 在定位没有生效前也是有时间数据的,可以直接解析 + gnss->time.hour = (buf[7] - '0') * 10 + (buf[8] - '0'); // 时间 + gnss->time.minute = (buf[9] - '0') * 10 + (buf[10] - '0'); + gnss->time.second = (buf[11] - '0') * 10 + (buf[12] - '0'); + temp = get_parameter_index(9, buf); + gnss->time.day = (buf[temp + 0] - '0') * 10 + (buf[temp + 1] - '0'); // 日期 + gnss->time.month = (buf[temp + 2] - '0') * 10 + (buf[temp + 3] - '0'); + gnss->time.year = (buf[temp + 4] - '0') * 10 + (buf[temp + 5] - '0') + 2000; + + utc_to_btc(&gnss->time); + + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 GGA语句解析 +// 参数说明 *line 接收到的语句信息 +// 参数说明 *gnss 保存解析后的数据 +// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 +// 使用示例 gps_gngga_parse((char *)data_buffer, &gnss); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 gps_gngga_parse (char *line, gnss_info_struct *gnss) +{ + uint8 state = 0; + char *buf = line; + uint8 return_state = 0; + + state = buf[get_parameter_index(2, buf)]; + + if(',' != state) + { + gnss->satellite_used = (uint8)get_int_number(&buf[get_parameter_index(7, buf)]); + gnss->height = get_float_number(&buf[get_parameter_index(9, buf)]) + get_float_number(&buf[get_parameter_index(11, buf)]); // 高度 = 海拔高度 + 地球椭球面相对大地水准面的高度 + return_state = 1; + } + + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 THS语句解析 +// 参数说明 *line 接收到的语句信息 +// 参数说明 *gnss 保存解析后的数据 +// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 +// 使用示例 gps_gnths_parse((char *)data_buffer, &gnss); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 gps_gnths_parse (char *line, gnss_info_struct *gnss) +{ + uint8 state = 0; + char *buf = line; + uint8 return_state = 0; + + state = buf[get_parameter_index(2, buf)]; + + if('A' == state) + { + gnss->antenna_direction_state = 1; + gnss->antenna_direction = get_float_number(&buf[get_parameter_index(1, buf)]); + return_state = 1; + } + else + { + gnss->antenna_direction_state = 0; + } + + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 计算从第一个点到第二个点的距离 +// 参数说明 latitude1 第一个点的纬度 +// 参数说明 longitude1 第一个点的经度 +// 参数说明 latitude2 第二个点的纬度 +// 参数说明 longitude2 第二个点的经度 +// 返回参数 double 返回两点距离 +// 使用示例 get_two_points_distance(latitude1_1, longitude1, latitude2, longitude2); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +double get_two_points_distance (double latitude1, double longitude1, double latitude2, double longitude2) +{ + const double EARTH_RADIUS = 6378137; // 地球半径(单位:m) + double rad_latitude1 = 0; + double rad_latitude2 = 0; + double rad_longitude1 = 0; + double rad_longitude2 = 0; + double distance = 0; + double a = 0; + double b = 0; + + rad_latitude1 = ANGLE_TO_RAD(latitude1); // 根据角度计算弧度 + 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 里面实现的算法 + distance = distance * EARTH_RADIUS; + + return distance; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 计算从第一个点到第二个点的方位角 +// 参数说明 latitude1 第一个点的纬度 +// 参数说明 longitude1 第一个点的经度 +// 参数说明 latitude2 第二个点的纬度 +// 参数说明 longitude2 第二个点的经度 +// 返回参数 double 返回方位角(0至360) +// 使用示例 get_two_points_azimuth(latitude1_1, longitude1, latitude2, longitude2); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +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 ((0 < angle) ? angle : (angle + 360)); +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 解析GPS数据 +// 参数说明 void +// 返回参数 uint8 0-解析成功 1-解析失败 可能数据包错误 +// 使用示例 gps_data_parse(); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +uint8 gnss_data_parse (void) +{ + uint8 return_state = 0; + uint8 check_buffer[5] = {'0', 'x', 0x00, 0x00, 0x00}; + uint8 bbc_xor_origin = 0; + uint8 bbc_xor_calculation = 0; + uint32 data_len = 0; + + do + { + if(GPS_STATE_RECEIVED == gnss_rmc_state) + { + gnss_rmc_state = GPS_STATE_PARSING; + strncpy((char *)&check_buffer[2], strchr((const char *)gps_rmc_buffer, '*') + 1, 2); + bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); + for(bbc_xor_calculation = gps_rmc_buffer[1], data_len = 2; '*' != gps_rmc_buffer[data_len]; data_len ++) + { + bbc_xor_calculation ^= gps_rmc_buffer[data_len]; + } + if(bbc_xor_calculation != bbc_xor_origin) + { + // 数据校验失败 + return_state = 1; + break; + } + + gps_gnrmc_parse((char *)gps_rmc_buffer, &gnss); + } + gnss_rmc_state = GPS_STATE_RECEIVING; + + if(GPS_STATE_RECEIVED == gnss_gga_state) + { + gnss_gga_state = GPS_STATE_PARSING; + strncpy((char *)&check_buffer[2], strchr((const char *)gps_gga_buffer, '*') + 1, 2); + bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); + + for(bbc_xor_calculation = gps_gga_buffer[1], data_len = 2; '*' != gps_gga_buffer[data_len]; data_len ++) + { + bbc_xor_calculation ^= gps_gga_buffer[data_len]; + } + if(bbc_xor_calculation != bbc_xor_origin) + { + // 数据校验失败 + return_state = 1; + break; + } + + gps_gngga_parse((char *)gps_gga_buffer, &gnss); + } + gnss_gga_state = GPS_STATE_RECEIVING; + + if(GPS_STATE_RECEIVED == gnss_ths_state) + { + gnss_ths_state = GPS_STATE_PARSING; + strncpy((char *)&check_buffer[2], strchr((const char *)gps_ths_buffer, '*') + 1, 2); + bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); + + for(bbc_xor_calculation = gps_ths_buffer[1], data_len = 2; '*' != gps_ths_buffer[data_len]; data_len ++) + { + bbc_xor_calculation ^= gps_ths_buffer[data_len]; + } + if(bbc_xor_calculation != bbc_xor_origin) + { + // 数据校验失败 + return_state = 1; + break; + } + + gps_gnths_parse((char *)gps_ths_buffer, &gnss); + } + gnss_ths_state = GPS_STATE_RECEIVING; + + }while(0); + return return_state; +} + + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 GPS串口回调函数 +// 参数说明 void +// 返回参数 void +// 使用示例 gps_uart_callback(); +// 备注信息 此函数需要在串口接收中断内进行调用 +//------------------------------------------------------------------------------------------------------------------- +void gnss_uart_callback (void) +{ + uint8 temp_gps[6]; + uint32 temp_length = 0; + + + + + if(gnss_state) + { + uint8 dat; + while(uart_query_byte(GNSS_UART, &dat)) + { + fifo_write_buffer(&gnss_receiver_fifo, &dat, 1); + } + + if('\n' == dat) + { + // 读取前6个数据 用于判断语句类型 + temp_length = 6; + fifo_read_buffer(&gnss_receiver_fifo, temp_gps, &temp_length, FIFO_READ_ONLY); + + // 根据不同类型将数据拷贝到不同的缓冲区 + if(0 == strncmp((char *)&temp_gps[3], "RMC", 3)) + { + // 如果没有在解析数据则更新缓冲区的数据 + if(GPS_STATE_PARSING != gnss_rmc_state) + { + gnss_rmc_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_rmc_buffer, &temp_length, FIFO_READ_AND_CLEAN); + } + } + else if(0 == strncmp((char *)&temp_gps[3], "GGA", 3)) + { + // 如果没有在解析数据则更新缓冲区的数据 + if(GPS_STATE_PARSING != gnss_gga_state) + { + gnss_gga_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_gga_buffer, &temp_length, FIFO_READ_AND_CLEAN); + } + } + else if(0 == strncmp((char *)&temp_gps[3], "THS", 3)) + { + // 如果没有在解析数据则更新缓冲区的数据 + if(GPS_STATE_PARSING != gnss_ths_state) + { + gnss_ths_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_ths_buffer, &temp_length, FIFO_READ_AND_CLEAN); + } + } + + // 统一将FIFO清空 + fifo_clear(&gnss_receiver_fifo); + + gnss_flag = 1; + } + } +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 GPS初始化 +// 参数说明 void +// 返回参数 void +// 使用示例 gps_init(); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +void gnss_init (gps_device_enum gps_device) +{ + 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}; + + if((TAU1201 == gps_device) || (GN42A == gps_device)) + { + fifo_init(&gnss_receiver_fifo, FIFO_DATA_8BIT, gnss_receiver_buffer, GNSS_BUFFER_SIZE); + system_delay_ms(500); // 等待GPS启动后开始初始化 + uart_init(GNSS_UART, 115200, GNSS_RX, GNSS_TX); + + uart_write_buffer(GNSS_UART, (uint8 *)set_rate, sizeof(set_rate)); // 设置GPS更新速率为10hz 如果不调用此语句则默认为1hz + system_delay_ms(200); + + uart_write_buffer(GNSS_UART, (uint8 *)open_rmc, sizeof(open_rmc)); // 开启rmc语句 + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)open_gga, sizeof(open_gga)); // 开启gga语句 + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gll, sizeof(close_gll)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gsa, sizeof(close_gsa)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_grs, sizeof(close_grs)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gsv, sizeof(close_gsv)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_vtg, sizeof(close_vtg)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_zda, sizeof(close_zda)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gst, sizeof(close_gst)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_txt, sizeof(close_txt)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_txt_ant, sizeof(close_txt_ant)); + system_delay_ms(50); + + gnss_state = 1; + uart_rx_interrupt(GNSS_UART, 1); + } + else if(GN43RFA == gps_device) + { + // GN43RFA RTK模块不需要进行参数设置,如果需要修改参数应该使用专用的上位机修改参数 + fifo_init(&gnss_receiver_fifo, FIFO_DATA_8BIT, gnss_receiver_buffer, GNSS_BUFFER_SIZE); + uart_init(GNSS_UART, 115200, GNSS_RX, GNSS_TX); + gnss_state = 1; + uart_rx_interrupt(GNSS_UART, 1); + } + +} diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_gnss.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_gnss.h new file mode 100644 index 0000000..5d58976 --- /dev/null +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_gnss.h @@ -0,0 +1,125 @@ +/********************************************************************************************************************* +* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* Copyright (c) 2022 SEEKFREE 逐飞科技 +* +* 本文件是 TC264 开源库的一部分 +* +* TC264 开源库 是免费软件 +* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 +* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 +* +* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 +* 甚至没有隐含的适销性或适合特定用途的保证 +* 更多细节请参见 GPL +* +* 您应该在收到本开源库的同时收到一份 GPL 的副本 +* 如果没有,请参阅 +* +* 额外注明: +* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 +* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 +* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 +* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) +* +* 文件名称 zf_device_gnss +* 公司名称 成都逐飞科技有限公司 +* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 +* 开发环境 ADS v1.9.20 +* 适用平台 TC264D +* 店铺链接 https://seekfree.taobao.com/ +* +* 修改记录 +* 日期 作者 备注 +* 2023-12-28 pudding first version +********************************************************************************************************************/ +/********************************************************************************************************************* +* 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* RX 查看 zf_device_gnss.h 中 GNSS_RX 宏定义 +* TX 查看 zf_device_gnss.h 中 GNSS_TX 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* ------------------------------------ +********************************************************************************************************************/ + +#ifndef _zf_device_gnss_h_ +#define _zf_device_gnss_h_ + +#include "zf_common_typedef.h" + +//-------------------------------------------------------------------------------------------------- +//引脚配置 +//-------------------------------------------------------------------------------------------------- +#define GNSS_UART (UART_3) +#define GNSS_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 +#define GNSS_TX (UART3_RX_P15_7) // GPS TX串口引脚 + +#define ANGLE_TO_RAD(x) ( (x) * PI / 180.0 ) // 角度转换为弧度 +#define RAD_TO_ANGLE(x) ( (x) * 180.0 / PI ) // 弧度转换为角度 +#define PI ( 3.1415926535898 ) + +typedef enum +{ + TAU1201 = 1, // 逐飞科技双频GPS模块 + GN42A = 1, // 逐飞科技双频GPS模块 与TAU1201是一样的 + GN43RFA = 2, // 逐飞科技三频RTK模块 +}gps_device_enum; + +typedef struct +{ + uint16 year; + uint8 month; + uint8 day; + uint8 hour; + uint8 minute; + uint8 second; +}gps_time_struct; + +typedef struct +{ + gps_time_struct time; // 时间 + + uint8 state; // 有效状态 1:定位有效 0:定位无效 + + uint16 latitude_degree; // 度 + uint16 latitude_cent; // 分 + uint16 latitude_second; // 秒 这里的秒是被放大了100倍的,主要是避免使用浮点数 + uint16 longitude_degree; // 度 + uint16 longitude_cent; // 分 + uint16 longitude_second; // 秒 这里的秒是被放大了100倍的,主要是避免使用浮点数 + + double latitude; // 纬度 + double longitude; // 经度 + + int8 ns; // 纬度半球 N(北半球)或 S(南半球) + int8 ew; // 经度半球 E(东经)或 W(西经) + + float speed; // 速度(公里/每小时) + float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准)+ + uint8 antenna_direction_state; // 双天线测向有效状态 1:测向有效 0:测向无效,无效时antenna_direction数据是无效的 + float antenna_direction; // 主天线指向从天线与真北构成的夹角(000.0~359.9 度) + + // 下面两个个信息从GNGGA语句中获取 + uint8 satellite_used; // 用于定位的卫星数量 + float height; // 高度 +}gnss_info_struct; + +typedef enum +{ + GPS_STATE_RECEIVING, // 正在接收数据 + GPS_STATE_RECEIVED, // 数据接收完成 + GPS_STATE_PARSING, // 正在解析 +}gps_state_enum; + +extern gnss_info_struct gnss; +extern uint8 gnss_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); +uint8 gnss_data_parse (void); +void gnss_uart_callback (void); +void gnss_init (gps_device_enum gps_device); + +#endif diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_gps_tau1201.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_gps_tau1201.c deleted file mode 100644 index da46a99..0000000 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_gps_tau1201.c +++ /dev/null @@ -1,541 +0,0 @@ -/********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 -* Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 -* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 -* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* -* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 -* 甚至没有隐含的适销性或适合特定用途的保证 -* 更多细节请参见 GPL -* -* 您应该在收到本开源库的同时收到一份 GPL 的副本 -* 如果没有,请参阅 -* -* 额外注明: -* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 -* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 -* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 -* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* -* 文件名称 zf_device_gps_tau1201 -* 公司名称 成都逐飞科技有限公司 -* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D -* 店铺链接 https://seekfree.taobao.com/ -* -* 修改记录 -* 日期 作者 备注 -* 2022-09-15 pudding first version -* 2023-04-28 pudding 增加中文注释说明 -********************************************************************************************************************/ -/******************************************************************************************************************** -* 接线定义: -* ------------------------------------ -* 模块管脚 单片机管脚 -* RX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_RX 宏定义 -* TX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_TX 宏定义 -* VCC 3.3V电源 -* GND 电源地 -* ------------------------------------ -********************************************************************************************************************/ - -#include "math.h" -#include "zf_common_function.h" -#include "zf_common_fifo.h" -#include "zf_driver_delay.h" -#include "zf_driver_uart.h" - -#include "zf_device_gps_tau1201.h" - -#define GPS_TAU1201_BUFFER_SIZE ( 128 ) - -uint8 gps_tau1201_flag = 0; // 1:采集完成等待处理数据 0:没有采集完成 -gps_info_struct gps_tau1201; // GPS解析之后的数据 - -static uint8 gps_tau1201_state = 0; // 1:GPS初始化完成 -static fifo_obj_struct gps_tau1201_receiver_fifo; // -static uint8 gps_tau1201_receiver_buffer[GPS_TAU1201_BUFFER_SIZE]; // 数据存放数组 - -gps_state_enum gps_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 -gps_state_enum gps_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 - -static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; // GGA语句缓冲区 -static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; // RMC语句缓冲区 - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 获取指定 ',' 后面的索引 -// 参数说明 num 第几个逗号 -// 参数说明 *str 字符串 -// 返回参数 uint8 返回索引 -// 使用示例 get_parameter_index(1, s); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static uint8 get_parameter_index (uint8 num, char *str) -{ - uint8 i = 0, j = 0; - char *temp = strchr(str, '\n'); - uint8 len = 0, len1 = 0; - - 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; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 给定字符串第一个 ',' 之前的数据转换为int -// 参数说明 *s 字符串 -// 返回参数 float 返回数值 -// 使用示例 get_int_number(&buf[get_parameter_index(7, buf)]); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static int get_int_number (char *s) -{ - char buf[10]; - uint8 i = 0; - int return_value = 0; - i = get_parameter_index(1, s); - i = i - 1; - strncpy(buf, s, i); - buf[i] = 0; - return_value = func_str_to_int(buf); - return return_value; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 给定字符串第一个 ',' 之前的数据转换为float -// 参数说明 *s 字符串 -// 返回参数 float 返回数值 -// 使用示例 get_float_number(&buf[get_parameter_index(8, buf)]); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static float get_float_number (char *s) -{ - uint8 i = 0; - char buf[15]; - float return_value = 0; - - i = get_parameter_index(1, s); - i = i - 1; - strncpy(buf, s, i); - buf[i] = 0; - return_value = (float)func_str_to_double(buf); - return return_value; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 给定字符串第一个 ',' 之前的数据转换为double -// 参数说明 *s 字符串 -// 返回参数 double 返回数值 -// 使用示例 get_double_number(&buf[get_parameter_index(3, buf)]); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static double get_double_number (char *s) -{ - uint8 i = 0; - char buf[15]; - double return_value = 0; - - i = get_parameter_index(1, s); - i = i - 1; - strncpy(buf, s, i); - buf[i] = 0; - return_value = func_str_to_double(buf); - return return_value; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 世界时间转换为北京时间 -// 参数说明 *time 保存的时间 -// 返回参数 void -// 使用示例 utc_to_btc(&gps->time); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static void utc_to_btc (gps_time_struct *time) -{ - uint8 day_num = 0; - - time->hour = time->hour + 8; - if(23 < time->hour) - { - time->hour -= 24; - time->day += 1; - - if(2 == time->month) - { - day_num = 28; - if((0 == time->year % 4 && 0 != time->year % 100) || 0 == time->year % 400) // 判断是否为闰年 - { - day_num ++; // 闰月 2月为29天 - } - } - else - { - day_num = 31; // 1 3 5 7 8 10 12这些月份为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(12 < time->month) - { - time->month -= 12; - time->year ++; - } - } - } -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 RMC语句解析 -// 参数说明 *line 接收到的语句信息 -// 参数说明 *gps 保存解析后的数据 -// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 -// 使用示例 gps_gnrmc_parse((char *)data_buffer, &gps_tau1201); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static uint8 gps_gnrmc_parse (char *line, gps_info_struct *gps) -{ - uint8 state = 0, temp = 0; - - double latitude = 0; // 纬度 - double longitude = 0; // 经度 - - double lati_cent_tmp = 0, lati_second_tmp = 0; - double long_cent_tmp = 0, long_second_tmp = 0; - float speed_tmp = 0; - char *buf = line; - uint8 return_state = 0; - - state = buf[get_parameter_index(2, buf)]; - - gps->state = 0; - if('A' == state) // 如果数据有效 则解析数据 - { - return_state = 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; // 纬度转换为度分秒 - lati_cent_tmp = (latitude - gps->latitude_degree * 100); - gps->latitude_cent = (int)lati_cent_tmp; - lati_second_tmp = (lati_cent_tmp - gps->latitude_cent) * 6000; - gps->latitude_second = (int)lati_second_tmp; - - gps->longitude_degree = (int)longitude / 100; // 经度转换为度分秒 - long_cent_tmp = (longitude - gps->longitude_degree * 100); - gps->longitude_cent = (int)long_cent_tmp; - long_second_tmp = (long_cent_tmp - gps->longitude_cent) * 6000; - gps->longitude_second = (int)long_second_tmp; - - gps->latitude = gps->latitude_degree + lati_cent_tmp / 60; - gps->longitude = gps->longitude_degree + long_cent_tmp / 60; - - speed_tmp = get_float_number(&buf[get_parameter_index(7, buf)]); // 速度(海里/小时) - gps->speed = speed_tmp * 1.85f; // 转换为公里/小时 - gps->direction = get_float_number(&buf[get_parameter_index(8, buf)]); // 角度 - } - - // 在定位没有生效前也是有时间数据的,可以直接解析 - gps->time.hour = (buf[7] - '0') * 10 + (buf[8] - '0'); // 时间 - 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'); // 日期 - 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_state; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 GGA语句解析 -// 参数说明 *line 接收到的语句信息 -// 参数说明 *gps 保存解析后的数据 -// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 -// 使用示例 gps_gngga_parse((char *)data_buffer, &gps_tau1201); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static uint8 gps_gngga_parse (char *line, gps_info_struct *gps) -{ - uint8 state = 0; - char *buf = line; - uint8 return_state = 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)]); // 高度 = 海拔高度 + 地球椭球面相对大地水准面的高度 - return_state = 1; - } - - return return_state; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 计算从第一个点到第二个点的距离 -// 参数说明 latitude1 第一个点的纬度 -// 参数说明 longitude1 第一个点的经度 -// 参数说明 latitude2 第二个点的纬度 -// 参数说明 longitude2 第二个点的经度 -// 返回参数 double 返回两点距离 -// 使用示例 get_two_points_distance(latitude1_1, longitude1, latitude2, longitude2); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -double get_two_points_distance (double latitude1, double longitude1, double latitude2, double longitude2) -{ - const double EARTH_RADIUS = 6378137; // 地球半径(单位:m) - double rad_latitude1 = 0; - double rad_latitude2 = 0; - double rad_longitude1 = 0; - double rad_longitude2 = 0; - double distance = 0; - double a = 0; - double b = 0; - - rad_latitude1 = ANGLE_TO_RAD(latitude1); // 根据角度计算弧度 - 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 里面实现的算法 - distance = distance * EARTH_RADIUS; - - return distance; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 计算从第一个点到第二个点的方位角 -// 参数说明 latitude1 第一个点的纬度 -// 参数说明 longitude1 第一个点的经度 -// 参数说明 latitude2 第二个点的纬度 -// 参数说明 longitude2 第二个点的经度 -// 返回参数 double 返回方位角(0至360) -// 使用示例 get_two_points_azimuth(latitude1_1, longitude1, latitude2, longitude2); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -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 ((0 < angle) ? angle : (angle + 360)); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 解析GPS数据 -// 参数说明 void -// 返回参数 uint8 0-解析成功 1-解析失败 可能数据包错误 -// 使用示例 gps_data_parse(); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -uint8 gps_data_parse (void) -{ - uint8 return_state = 0; - uint8 check_buffer[5] = {'0', 'x', 0x00, 0x00, 0x00}; - uint8 bbc_xor_origin = 0; - uint8 bbc_xor_calculation = 0; - uint32 data_len = 0; - - do - { - if(GPS_STATE_RECEIVED == gps_rmc_state) - { - gps_rmc_state = GPS_STATE_PARSING; - strncpy((char *)&check_buffer[2], strchr((const char *)gps_rmc_buffer, '*') + 1, 2); - bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); - for(bbc_xor_calculation = gps_rmc_buffer[1], data_len = 2; '*' != gps_rmc_buffer[data_len]; data_len ++) - { - bbc_xor_calculation ^= gps_rmc_buffer[data_len]; - } - if(bbc_xor_calculation != bbc_xor_origin) - { - // 数据校验失败 - return_state = 1; - break; - } - - gps_gnrmc_parse((char *)gps_rmc_buffer, &gps_tau1201); - } - gps_rmc_state = GPS_STATE_RECEIVING; - - if(GPS_STATE_RECEIVED == gps_gga_state) - { - gps_gga_state = GPS_STATE_PARSING; - strncpy((char *)&check_buffer[2], strchr((const char *)gps_gga_buffer, '*') + 1, 2); - bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); - - for(bbc_xor_calculation = gps_gga_buffer[1], data_len = 2; '*' != gps_gga_buffer[data_len]; data_len ++) - { - bbc_xor_calculation ^= gps_gga_buffer[data_len]; - } - if(bbc_xor_calculation != bbc_xor_origin) - { - // 数据校验失败 - return_state = 1; - break; - } - - gps_gngga_parse((char *)gps_gga_buffer, &gps_tau1201); - } - gps_gga_state = GPS_STATE_RECEIVING; - - }while(0); - return return_state; -} - - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 GPS串口回调函数 -// 参数说明 void -// 返回参数 void -// 使用示例 gps_uart_callback(); -// 备注信息 此函数需要在串口接收中断内进行调用 -//------------------------------------------------------------------------------------------------------------------- -void gps_uart_callback (void) -{ - uint8 temp_gps[6]; - uint32 temp_length = 0; - - if(gps_tau1201_state) - { - uint8 dat; - while(uart_query_byte(GPS_TAU1201_UART, &dat)) - { - fifo_write_buffer(&gps_tau1201_receiver_fifo, &dat, 1); - } - - if('\n' == dat) - { - // 读取前6个数据 用于判断语句类型 - temp_length = 6; - fifo_read_buffer(&gps_tau1201_receiver_fifo, temp_gps, &temp_length, FIFO_READ_ONLY); - - // 根据不同类型将数据拷贝到不同的缓冲区 - if(0 == strncmp((char *)&temp_gps[3], "RMC", 3)) - { - // 如果没有在解析数据则更新缓冲区的数据 - if(GPS_STATE_PARSING != gps_rmc_state) - { - gps_rmc_state = GPS_STATE_RECEIVED; - temp_length = fifo_used(&gps_tau1201_receiver_fifo); - fifo_read_buffer(&gps_tau1201_receiver_fifo, gps_rmc_buffer, &temp_length, FIFO_READ_AND_CLEAN); - } - } - else if(0 == strncmp((char *)&temp_gps[3], "GGA", 3)) - { - // 如果没有在解析数据则更新缓冲区的数据 - if(GPS_STATE_PARSING != gps_gga_state) - { - gps_gga_state = GPS_STATE_RECEIVED; - temp_length = fifo_used(&gps_tau1201_receiver_fifo); - fifo_read_buffer(&gps_tau1201_receiver_fifo, gps_gga_buffer, &temp_length, FIFO_READ_AND_CLEAN); - } - } - - // 统一将FIFO清空 - fifo_clear(&gps_tau1201_receiver_fifo); - - gps_tau1201_flag = 1; - } - } -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 GPS初始化 -// 参数说明 void -// 返回参数 void -// 使用示例 gps_init(); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -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}; - - fifo_init(&gps_tau1201_receiver_fifo, FIFO_DATA_8BIT, gps_tau1201_receiver_buffer, GPS_TAU1201_BUFFER_SIZE); - system_delay_ms(500); // 等待GPS启动后开始初始化 - uart_init(GPS_TAU1201_UART, 115200, GPS_TAU1201_RX, GPS_TAU1201_TX); - uart_rx_interrupt(GPS_TAU1201_UART, 0); - - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)set_rate, sizeof(set_rate)); // 设置GPS更新速率为10hz 如果不调用此语句则默认为1hz - system_delay_ms(200); - - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)open_rmc, sizeof(open_rmc)); // 开启rmc语句 - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)open_gga, sizeof(open_gga)); // 开启gga语句 - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gll, sizeof(close_gll)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gsa, sizeof(close_gsa)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_grs, sizeof(close_grs)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gsv, sizeof(close_gsv)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_vtg, sizeof(close_vtg)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_zda, sizeof(close_zda)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gst, sizeof(close_gst)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_txt, sizeof(close_txt)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_txt_ant, sizeof(close_txt_ant)); - system_delay_ms(50); - - gps_tau1201_state = 1; - uart_rx_interrupt(GPS_TAU1201_UART, 1); -} diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_gps_tau1201.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_gps_tau1201.h deleted file mode 100644 index c167bae..0000000 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_gps_tau1201.h +++ /dev/null @@ -1,117 +0,0 @@ -/********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 -* Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 -* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 -* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* -* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 -* 甚至没有隐含的适销性或适合特定用途的保证 -* 更多细节请参见 GPL -* -* 您应该在收到本开源库的同时收到一份 GPL 的副本 -* 如果没有,请参阅 -* -* 额外注明: -* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 -* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 -* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 -* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* -* 文件名称 zf_device_gps_tau1201 -* 公司名称 成都逐飞科技有限公司 -* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D -* 店铺链接 https://seekfree.taobao.com/ -* -* 修改记录 -* 日期 作者 备注 -* 2022-09-15 pudding first version -* 2023-04-28 pudding 增加中文注释说明 -********************************************************************************************************************/ -/******************************************************************************************************************** -* 接线定义: -* ------------------------------------ -* 模块管脚 单片机管脚 -* RX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_RX 宏定义 -* TX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_TX 宏定义 -* VCC 3.3V电源 -* GND 电源地 -* ------------------------------------ -********************************************************************************************************************/ - -#ifndef _zf_device_gps_tau1201_h_ -#define _zf_device_gps_tau1201_h_ - -#include "zf_common_typedef.h" - -//=================================================定义 定位模块 基本配置================================================ -#define GPS_TAU1201_UART (UART_3) -#define GPS_TAU1201_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 -#define GPS_TAU1201_TX (UART3_RX_P15_7) // GPS TX串口引脚 - -#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 -#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 -#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; // 时间- - uint8 state; // 有效状态 1:定位有效 0:定位无效 - uint16 latitude_degree; // 度 - uint16 latitude_cent; // 分 - uint16 latitude_second; // 秒 - uint16 longitude_degree; // 度 - uint16 longitude_cent; // 分 - uint16 longitude_second; // 秒 - double latitude; // 纬度 - double longitude; // 经度 - int8 ns; // 纬度半球 N(北半球)或 S(南半球) - int8 ew; // 经度半球 E(东经)或 W(西经) - float speed; // 速度(公里/每小时) - float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) - // 下面两个个信息从GNGGA语句中获取 - uint8 satellite_used; // 用于定位的卫星数量 - float height; // 高度 -}gps_info_struct; - -typedef enum -{ - GPS_STATE_RECEIVING, // 正在接收数据 - GPS_STATE_RECEIVED, // 数据接收完成 - GPS_STATE_PARSING, // 正在解析 -}gps_state_enum; -//================================================定义 定位模块 参数结构体================================================ - - -//=================================================声明 定位模块 全局变量================================================ -extern gps_info_struct gps_tau1201; // GPS解析之后的数据 -extern uint8 gps_tau1201_flag; // 1:采集完成等待处理数据 0:没有采集完成 -//=================================================声明 定位模块 全局变量================================================ - - -//=================================================声明 定位模块 基础函数================================================ -double get_two_points_distance (double lat1, double lng1, double lat2, double lng2); // 计算从第一个点到第二个点的距离(单位:m) -double get_two_points_azimuth (double lat1, double lon1, double lat2, double lon2); // 计算从第一个点到第二个点的方位角(单位:°) -uint8 gps_data_parse (void); // 解析GPS数据 -void gps_uart_callback (void); // GPS回调函数 -void gps_init (void); // GPS初始化 -//=================================================声明 定位模块 基础函数================================================ -#endif diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_icm20602.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_icm20602.c index f4ae830..ddebf3c 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_icm20602.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_icm20602.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_icm20602 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_icm20602.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_icm20602.h index 67724ad..209972b 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_icm20602.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_icm20602.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_icm20602 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_imu660ra.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_imu660ra.c index 95144f9..02fdb9e 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_imu660ra.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_imu660ra.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu660ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_imu660ra.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_imu660ra.h index a689df1..348e6a1 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_imu660ra.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_imu660ra.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu660ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_imu963ra.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_imu963ra.c index 92ec0f6..595142a 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_imu963ra.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_imu963ra.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu963ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_imu963ra.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_imu963ra.h index 4d0d9f9..c0f981f 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_imu963ra.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_imu963ra.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu963ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_ips114.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_ips114.c index 78c6f3b..b13e338 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_ips114.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_ips114.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips114 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_ips114.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_ips114.h index 81dfc3c..ba932b1 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_ips114.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_ips114.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips114 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_ips200.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_ips200.c index cd8681f..37d9d04 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_ips200.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_ips200.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips200 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_ips200.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_ips200.h index ce59927..045bf27 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_ips200.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_ips200.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips200 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_key.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_key.c index 9e42c8a..8b240cb 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_key.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_key.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_key * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_key.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_key.h index bcab8aa..9c653cf 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_key.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_key.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_key * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_mpu6050.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_mpu6050.c index dc3c5b2..101a5ae 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_mpu6050.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_mpu6050.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_mpu6050 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_mpu6050.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_mpu6050.h index 3510e06..c8a086f 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_mpu6050.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_mpu6050.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_mpu6050 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_mt9v03x.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_mt9v03x.c index 231cfec..d38b8df 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_mt9v03x.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_mt9v03x.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_mt9v03x * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_mt9v03x.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_mt9v03x.h index 7786bc5..9d4650d 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_mt9v03x.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_mt9v03x.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_mt9v03x * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_oled.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_oled.c index 5314209..55aefa7 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_oled.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_oled.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_oled * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_oled.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_oled.h index d52d2fd..aadf048 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_oled.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_oled.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_oled * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_ov7725.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_ov7725.c index 12f6095..bac95fe 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_ov7725.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_ov7725.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ov7725 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_ov7725.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_ov7725.h index f45a4e8..2cb4026 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_ov7725.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_ov7725.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ov7725 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_scc8660.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_scc8660.c index 3483c93..38d65ff 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_scc8660.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_scc8660.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_scc8660 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_scc8660.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_scc8660.h index 815d272..537283a 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_scc8660.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_scc8660.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_scc8660 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_tft180.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_tft180.c index db50824..b661e91 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_tft180.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_tft180.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_tft180 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_tft180.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_tft180.h index 47491ee..54a72b3 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_tft180.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_tft180.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_tft180 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_tsl1401.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_tsl1401.c index 3f9db7f..d133c7c 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_tsl1401.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_tsl1401.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_tsl1401 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_tsl1401.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_tsl1401.h index 1fab12e..a7b061c 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_tsl1401.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_tsl1401.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_tsl1401 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_type.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_type.c index 497ba55..af24701 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_type.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_type.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_type * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -32,6 +32,7 @@ * 日期 作者 备注 * 2022-09-15 pudding first version * 2023-05-26 pudding 新增SPI WIFI 中断回调指针 +* 2024-01-16 pudding 移除SPI WIFI 中断回调指针 SPI WIFI将不再使用外部 ********************************************************************************************************************/ #include "zf_device_type.h" @@ -45,7 +46,6 @@ callback_function camera_dma_handler = type_default_callback; wireless_type_enum wireless_type = NO_WIRELESS; callback_function wireless_module_uart_handler = type_default_callback; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 -callback_function wireless_module_spi_handler = type_default_callback; // WIFI SPI GPIO中断函数指针,根据初始化时设置的函数进行跳转 tof_type_enum tof_type = NO_TOF; callback_function tof_module_exti_handler = type_default_callback; // ToF 模块 INT 更新中断 @@ -54,7 +54,7 @@ callback_function tof_module_exti_handler = type_default_callback; // 函数简介 默认回调函数 // 参数说明 void // 返回参数 void -// 使用示例 +// 使用示例 // 备注信息 保护性冗余设计 防止在没有初始化设备的时候跑飞 //------------------------------------------------------------------------------------------------------------------- static void type_default_callback (void) @@ -90,14 +90,7 @@ void set_camera_type (camera_type_enum type_set, callback_function vsync_callba void set_wireless_type (wireless_type_enum type_set, callback_function wireless_callback) { wireless_type = type_set; - if(WIFI_SPI == wireless_type) - { - wireless_module_spi_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); - } - else - { - wireless_module_uart_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); - } + wireless_module_uart_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); } //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_type.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_type.h index 19c36ca..3b124fe 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_type.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_type.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_type * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -56,7 +56,6 @@ typedef enum WIRELESS_UART, // 无线串口 BLUETOOTH_CH9141, // 蓝牙 CH9141 WIFI_UART, // 串口 WiFi - WIFI_SPI // SPI WiFi }wireless_type_enum; typedef enum diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c index 2bdb164..3cbc786 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_virtual_oscilloscope * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h index f518026..b0fd085 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_virtual_oscilloscope * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_wifi_spi.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_wifi_spi.c index 78a6d68..f9e51ca 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_wifi_spi.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_wifi_spi.c @@ -24,14 +24,13 @@ * 文件名称 zf_device_wifi_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 * 日期 作者 备注 -* 2023-05-27 pudding first version -* 2023-05-29 pudding 新增关闭休眠指令,提升通讯效率 +* 2022-09-21 SeekFree first version ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,1374 +52,615 @@ #include "zf_common_clock.h" #include "zf_common_debug.h" #include "zf_common_fifo.h" -#include "zf_common_function.h" #include "zf_driver_delay.h" #include "zf_driver_gpio.h" -#include "zf_common_interrupt.h" -#include "zf_driver_exti.h" #include "zf_driver_spi.h" #include "zf_device_type.h" #include "zf_device_wifi_spi.h" -#define WAIT_TIME_OUT (10000) // 单指令等待时间 单位:ms +#define WIFI_CONNECT_TIME_OUT 10000 // 单位毫秒 +#define SOCKET_CONNECT_TIME_OUT 50000 // 单位毫秒 +#define OTHER_TIME_OUT 1000 // 单位毫秒 -#define WIFI_SPI_WRITE_MAX 128 // 定义一次SPI通讯最大发送的数据长度 - -#define WIFI_SPI_WRITE_REQUEST 0x01 -#define WIFI_SPI_CHECK_STATE 0x02 -#define WIFI_SPI_WRITE_DATA 0x03 -#define WIFI_SPI_READ_DATA 0x04 -#define WIFI_SPI_WRITE_END 0x07 -#define WIFI_SPI_READ_END 0x08 - -#define WIFI_SPI_WRITE_ADDR 0x00 -#define WIFI_SPI_STATE_ADDR 0x04 +char wifi_spi_version[12]; // 保存模块固件版本信息 +char wifi_spi_mac_addr[20]; // 保存模块MAC地址信息 +char wifi_spi_ip_addr_port[25]; // 保存模块IP地址与端口信息 -volatile wifi_spi_buffer_state_enum wifi_buffer_state; -volatile wifi_spi_transmit_state_enum wifi_transmit_state; - -static fifo_obj_struct wifi_spi_fifo; -static uint8 wifi_spi_buffer[WIFI_SPI_BUFFER_SIZE]; // 数据存放数组 - -vuint8 wifi_spi_ack_flag = 0; // 0:模块未应答 1:模块已应答 -uint8 wifi_spi_init_flag; // 0:模块未初始化成功或者未连接 1:模块已连接并成功初始化 -vuint8 wifi_spi_packet_num; // 发送的数据包ID -vuint32 wifi_spi_send_remain_length; // 剩余的发送长度 - - - -wifi_spi_information_struct wifi_spi_information; +static fifo_struct wifi_spi_fifo; +static uint8 wifi_spi_buffer[WIFI_SPI_RECVIVE_FIFO_SIZE]; +static volatile wifi_spi_state_enum wifi_spi_mutex; //------------------------------------------------------------------------------------------------------------------- -// 函数简介 请求写入数据到模块 -// 参数说明 length 需要写入的长度 -// @return void -// Sample usage: +// 函数简介 等待WIFI SPI就绪 +// 参数说明 wait_time 最大等待时间 单位毫秒 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_write_request(uint16 length) +static uint8 wifi_spi_wait_idle (uint32 wait_time) { - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_REQUEST; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - head.magic = 0xFE; - head.sequence = wifi_spi_packet_num++; - head.length = length; + uint32 time = 0; - wifi_transmit_state = TRANSMIT_WRITE_REQUEST; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 7); - gpio_set_level(WIFI_SPI_CS_PIN, 1); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 读取模块状态 -// 参数说明 *length 需要读取或者写入的长度 -// @return WIFI_SPI_BUFFER_STATE_enum 模块状态 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static wifi_spi_buffer_state_enum wifi_spi_read_state(uint16 *length) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_CHECK_STATE; - head.addr = WIFI_SPI_STATE_ADDR; - head.dummy = 0x00; - - wifi_spi_ack_flag = 0; - wifi_transmit_state = TRANSMIT_READ_STATE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_transfer_8bit(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, &head.cmd, 7); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - - if(BUFFER_WRITE == head.magic) + wait_time = wait_time*100; + while(0 == gpio_get_level(WIFI_SPI_INT_PIN)) { - wifi_spi_packet_num = head.sequence; - } - *length = head.length; - - return (wifi_spi_buffer_state_enum)head.magic; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据发送完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_done(void) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_END; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_transmit_state = TRANSMIT_IDLE; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据接收完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_start(void) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_READ_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - wifi_transmit_state = TRANSMIT_READ; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据接收完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_done(void) -{ - wifi_spi_buffer_struct head; - - gpio_set_level(WIFI_SPI_CS_PIN, 1); - - head.cmd = WIFI_SPI_READ_END; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_transmit_state = TRANSMIT_IDLE; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块 -// 参数说明 *buff 需要写入数据的首地址 -// 参数说明 length 需要写入数据的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_data(const uint8 *buff, uint16 length) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - wifi_transmit_state = TRANSMIT_WRITE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - spi_write_8bit_array(WIFI_SPI_INDEX, buff, length); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_spi_send_done(); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_data_multi(wifi_spi_send_multi_struct *multi_buffer) -{ - uint8 i; - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - wifi_transmit_state = TRANSMIT_WRITE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - - for(i = 0; i < WIFI_SPI_MAX_MULTI; i++) - { - if(NULL != multi_buffer->source[i]) spi_write_8bit_array(WIFI_SPI_INDEX, multi_buffer->source[i], multi_buffer->length[i]); - } - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_spi_send_done(); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 接收模块发送的数据 -// 参数说明 *buff 接收数组的缓冲区首地址 -// 参数说明 length 需要接收的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_data(uint8 *buff, uint16 length) -{ - spi_read_8bit_array(WIFI_SPI_INDEX, buff, length); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送命令到模块 -// 参数说明 *str 命令字符串首地址 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_command(const char *str) -{ - uint8 state = 0; - uint16 send_length; - uint16 wait_time = 0; - - // 请求发送数据 - send_length = (uint16)strlen(str); - - // 等待传输进入空闲 - while(TRANSMIT_IDLE != wifi_transmit_state); - - // 如果没有进入发送状态则重新请求发送数据 - while(BUFFER_WRITE != wifi_buffer_state) - { - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - while(!wifi_spi_ack_flag) - { - wait_time++; - if((WAIT_TIME_OUT / 4) <= wait_time) - { - state = 1; - wifi_spi_init_flag = 0; // 模块已断开 - break; - } - system_delay_ms(1); - } - - if(1 == state) + system_delay_us(10); + time++; + if(wait_time <= time) { break; } } - - wifi_buffer_state = BUFFER_IDLE; - - if(0 == state) // 通讯未超时 - { - wifi_spi_send_remain_length = send_length; - // 发送消息 - wifi_spi_send_data((const uint8 *)str, send_length); - } + return (wait_time <= time); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 检查模块状态并读取模块发送的数据 -// 参数说明 void -// @return void -// Sample usage: +// 函数简介 写入数据到WIFI SPI +// 参数说明 *buffer1 第一组需要发送的数据缓冲区地址 +// 参数说明 length1 第一组数据长度 +// 参数说明 *buffer2 第二组需要发送的数据缓冲区地址 +// 参数说明 length2 第二组数据长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -void wifi_spi_check_state_read_buffer(void) +static void wifi_spi_write (const uint8 *buffer1, uint16 length1, const uint8 *buffer2, uint16 length2) { - uint16 wifi_spi_receive_length; // 本次接收到的数据数量 - uint8 wifi_spi_receive_buffer[WIFI_SPI_WRITE_MAX]; - - // 查询WIFI模块的状态 - wifi_buffer_state = wifi_spi_read_state(&wifi_spi_receive_length); - - // 如果需要读取WIFI模块数据,则保存需要读取的长度 - if(BUFFER_READ == wifi_buffer_state) + gpio_low(WIFI_SPI_CS_PIN); + if(NULL != buffer1) { - wifi_spi_receive_start(); - do - { - if(wifi_spi_receive_length > WIFI_SPI_WRITE_MAX) - { - wifi_spi_receive_data((uint8 *)wifi_spi_receive_buffer, WIFI_SPI_WRITE_MAX); - fifo_write_buffer(&wifi_spi_fifo, wifi_spi_receive_buffer, WIFI_SPI_WRITE_MAX); // 存入 FIFO - wifi_spi_receive_length = wifi_spi_receive_length - WIFI_SPI_WRITE_MAX; - } - else - { - wifi_spi_receive_data((uint8 *)wifi_spi_receive_buffer, wifi_spi_receive_length); - fifo_write_buffer(&wifi_spi_fifo, wifi_spi_receive_buffer, wifi_spi_receive_length); // 存入 FIFO - wifi_spi_receive_length = 0; - } - }while(wifi_spi_receive_length > 0); - wifi_spi_receive_done(); + spi_write_8bit_array(WIFI_SPI_INDEX, buffer1, length1); } - else if(BUFFER_IDLE == wifi_buffer_state) + if(NULL != buffer2) { - // 如果模块内部缓冲区状态为空闲,则传输状态也设置为空闲 - wifi_transmit_state = TRANSMIT_IDLE; + spi_write_8bit_array(WIFI_SPI_INDEX, buffer2, length2); } + gpio_high(WIFI_SPI_CS_PIN); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块 -// 参数说明 *buff 需要发送的数据首地址 -// 参数说明 length 需要发送的长度 -// @return uint32 剩余未发送长度 -// Sample usage: +// 函数简介 WIFI SPI 发送与接收同时进行(命令收发) +// 参数说明 *packets 发送与接收的地址 +// 参数说明 length 需要接收的长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_write_data(const uint8 *buff, uint32 length) +static void wifi_spi_transfer_command (wifi_spi_packets_struct *packets, uint16 length) { - uint16 send_length; - uint32 wait_time; + gpio_low(WIFI_SPI_CS_PIN); - // 记录需要发送的长度 - wifi_spi_send_remain_length = length; - - while(wifi_spi_send_remain_length) + spi_transfer_8bit(WIFI_SPI_INDEX, (uint8 *)&(packets->head), (uint8 *)&(packets->head), sizeof(wifi_spi_head_struct)); + + if(length) { - send_length = (uint16)func_limit_ab(wifi_spi_send_remain_length, 1, WIFI_SPI_WRITE_MAX); - - // 请求发送数据 - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - - // 最长等待5秒 - wait_time = 5000; - while(!wifi_spi_ack_flag) - { - wait_time--; - if(0 == wait_time) break; - system_delay_ms(1); - } - - if(BUFFER_WRITE == wifi_buffer_state) - { - // 发送消息 - wifi_spi_send_data(buff, send_length); - buff += send_length; - wifi_spi_send_remain_length -= send_length; - wifi_buffer_state = BUFFER_IDLE; - } - else - { - break; - } + spi_transfer_8bit(WIFI_SPI_INDEX, (const uint8 *)(packets->buffer), packets->buffer, length); } - - return wifi_spi_send_remain_length; + + gpio_high(WIFI_SPI_CS_PIN); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// @return uint32 剩余未发送长度 -// Sample usage: 发送数据总长度不能超过4092个 +// 函数简介 WIFI SPI 发送与接收同时进行(数据收发) +// 参数说明 *write_data 发送的数据缓冲区地址 +// 参数说明 *read_data 接收到的数据的存储地址 +// 参数说明 length 需要接收的长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_write_data_multi(wifi_spi_send_multi_struct *multi_buffer) +static void wifi_spi_transfer_data (const uint8 *write_data, wifi_spi_packets_struct *read_data, uint16 length) { - uint16 send_length; - uint32 wait_time; + gpio_low(WIFI_SPI_CS_PIN); - // 记录需要发送的长度 - send_length = multi_buffer->length[0] + multi_buffer->length[1] + multi_buffer->length[2] + multi_buffer->length[3] + multi_buffer->length[4] + multi_buffer->length[5] + multi_buffer->length[6] + multi_buffer->length[7]; + read_data->head.command = WIFI_SPI_DATA; + read_data->head.length = length; - if(WIFI_SPI_WRITE_MAX >= send_length) + spi_transfer_8bit(WIFI_SPI_INDEX, (uint8 *)&(read_data->head), (uint8 *)&(read_data->head), sizeof(wifi_spi_head_struct)); + + if(WIFI_SPI_RECVIVE_SIZE < length) { - // 请求发送数据 - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - - // 最长等待5秒 - wait_time = 5000; - while(!wifi_spi_ack_flag) - { - wait_time--; - if(0 == wait_time) break; - system_delay_ms(1); - } - - if(BUFFER_WRITE == wifi_buffer_state) - { - // 发送消息 - wifi_spi_send_data_multi(multi_buffer); - send_length = 0; - wifi_buffer_state = BUFFER_IDLE; - } + spi_transfer_8bit(WIFI_SPI_INDEX, write_data, read_data->buffer, WIFI_SPI_RECVIVE_SIZE); + spi_write_8bit_array(WIFI_SPI_INDEX, &write_data[WIFI_SPI_RECVIVE_SIZE], length - WIFI_SPI_RECVIVE_SIZE); } - - return send_length; + else + { + // 将需要发送的数据拷贝到读取缓冲区,避免出现write_data越界访问 + memcpy(read_data->buffer, write_data, length); + spi_transfer_8bit(WIFI_SPI_INDEX, read_data->buffer, read_data->buffer, WIFI_SPI_RECVIVE_SIZE); + } + gpio_high(WIFI_SPI_CS_PIN); } -//-------------------------------------------------------------------------------------------------- -// 函数简介 等待模块响应 -// 参数说明 *wait_buffer 等待的响应的字符串 -// 参数说明 timeout 超时时间 -// 返回参数 uint8 0:模块响应指定数据 1:模块未响应指定数据或超时 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_wait_ack (char *wait_buffer, uint32 timeout) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 参数设置 +// 参数说明 command 命令类型 +// 参数说明 *buffer 参数地址 +// 参数说明 length 参数长度 +// 参数说明 wait_time 最大等待时间 单位100微妙 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_set_parameter (wifi_spi_packets_command_enum command, uint8 *buffer, uint16 length, uint32 wait_time) { - uint8 return_state = 1; - char receiver_buffer[8] = {0, 0, 0, 0, 0, 0, 0, 0}; - uint32 receiver_len = 8; - + uint8 return_state; + wifi_spi_head_struct head; + return_state = 1; do { - system_delay_ms(1); - // 判断接收缓冲区内是否有需要响应的指定数据 如果有 则跳出循环并且返回0 - receiver_len = 8; - fifo_read_tail_buffer(&wifi_spi_fifo, (uint8 *)receiver_buffer, &receiver_len, FIFO_READ_ONLY); + head.command = command; + head.length = length; + + // 等待从机准备就绪 + if(wifi_spi_wait_idle(wait_time)) + { + break; + } - if(strstr(receiver_buffer, wait_buffer)) + wifi_spi_write(&head.command, sizeof(wifi_spi_head_struct), buffer, length); + if(wifi_spi_wait_idle(wait_time)) + { + break; + } + // 接收应答信号 + + head.command = WIFI_SPI_DATA; + head.length = 0; + wifi_spi_transfer_command((wifi_spi_packets_struct *)&head, head.length); + system_delay_us(20); + if(WIFI_SPI_REPLY_OK == head.command) { return_state = 0; - break; } - else if(strstr(receiver_buffer, "ERROR") || strstr(receiver_buffer, "busy")) - { - // 如果接收到报错或者模块忙 则跳出循环并且返回1 - return_state = 1; - break; - } - }while(timeout --); + }while(0); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 清除WiFi接收缓冲区内容 -// 参数说明 void -// 返回参数 void -// 使用示例 wifi_spi_clear_receive_buffer(); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static void wifi_spi_clear_receive_buffer (void) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 模块信息获取 +// 参数说明 command 命令类型 +// 参数说明 *buffer 保存接收到的参数地址 +// 参数说明 wait_time 最大等待时间 单位100微妙 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_parameter (wifi_spi_packets_command_enum command, wifi_spi_packets_struct *read_data, uint32 wait_time) { - // 清空WiFi接收缓冲区 - fifo_clear(&wifi_spi_fifo); -} + uint8 return_state; -//-------------------------------------------------------------------------------------------------- -// 函数简介 模块数据解析 -// 参数说明 *target_buffer 目标存放地址指针 字符串数组 -// 参数说明 *origin_buffer 数据来源地址指针 字符串数组 -// 参数说明 start_char 起始提取字节 例如从 "1234" 中从 '2' 开始提取 就应该填入 '2' -// 参数说明 end_char 结束提取字节 例如从 "1234" 中在 '4' 结束提取 就应该填入 '\0'(0x00 空字符 一般是字符串结尾) -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_data_parse(wifi_spi_information.mac, wifi_spi_receive_buffer, '"', '"'); // 调用获取本机mac地址后,调用此函数提取mac地址 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char start_char, char end_char) -{ - uint8 return_state = 0; - char *location1; - char *location2; - location1 = strchr((char *)origin_buffer, start_char); - if(location1) + return_state = 1; + do { - location1 ++; - location2 = strchr(location1, end_char); - if(location2) + // 等待从机准备就绪 + if(wifi_spi_wait_idle(wait_time)) { - memcpy(target_buffer, location1, location2-location1); + break; } - else + read_data->head.command = command; + wifi_spi_write(&(read_data->head.command), WIFI_SPI_RECVIVE_SIZE, NULL, 0); + + if(wifi_spi_wait_idle(wait_time)) { - return_state = 1; + break; } - } - else - { - return_state = 1; - } + read_data->head.command = WIFI_SPI_DATA; + read_data->head.length = 0; + wifi_spi_transfer_command(read_data, WIFI_SPI_RECVIVE_SIZE); + return_state = 0; + }while(0); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 查看模块版本信息 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_get_version(); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 固件版本获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,固件版本信息以字符串形式保存在wifi_spi_version数组中 +//------------------------------------------------------------------------------------------------------------------- static uint8 wifi_spi_get_version (void) { - char *location1; - uint8 return_state = 0; - uint8 receiver_buffer[256]; - uint32 receiver_len = 256; + uint8 return_state; + wifi_spi_packets_struct temp_packets; - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+GMR\r\n"); - do + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_VERSION, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_VERSION == temp_packets.head.command)) { - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - location1 = strrchr((char *)receiver_buffer, ':'); - if(wifi_spi_data_parse(wifi_spi_information.version, (uint8 *)location1, ':', '(')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - + memcpy(wifi_spi_version, temp_packets.buffer, temp_packets.head.length); + } return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 模块回显设置 -// 参数说明 model 0:关闭模块的回写功能 其他:开启模块回写 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_echo_set("1");//开启模块回写功能 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_echo_set (char *model) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI MAC地址获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,MAC地址信息以字符串形式保存在wifi_spi_mac_addr数组中 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_mac_addr (void) { - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - if('1' == *model) + uint8 return_state; + wifi_spi_packets_struct temp_packets; + + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_MAC_ADDR, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_MAC_ADDR == temp_packets.head.command)) { - wifi_spi_send_command("ATE1\r\n"); + memcpy(wifi_spi_mac_addr, temp_packets.buffer, temp_packets.head.length); + } + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI IP地址与端口号获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 +// 需要在连接Socket之后调用此函数才能正常获取信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_ip_addr_port (void) +{ + uint8 return_state; + wifi_spi_packets_struct temp_packets; + + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_IP_ADDR, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_IP_ADDR == temp_packets.head.command)) + { + memcpy(wifi_spi_ip_addr_port, temp_packets.buffer, temp_packets.head.length); + } + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 设置连接的WiFi信息并尝试连接WiFi +// 参数说明 *wifi_ssid WIFI名称 +// 参数说明 *pass_word WIFI密码 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_wifi_connect("SEEKFREE", "SEEKFREE123"); +// 备注信息 wifi_spi_wifi_connect("SEEKFREE", NULL); // 连接没有密码的WIFI热点 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_wifi_connect (char *wifi_ssid, char *pass_word) +{ + uint8 return_state; + uint8 temp_buffer[64]; + uint16 length; + + if(NULL != pass_word) + { + // WIFI热点有密码发送热点名称与密码 + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n%s\r\n", wifi_ssid, pass_word); } else { - wifi_spi_send_command("ATE0\r\n"); + // WIFI热点没有密码只需要发送热点名称 + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n", wifi_ssid); } - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + return_state = wifi_spi_set_parameter(WIFI_SPI_SET_WIFI_INFORMATION, temp_buffer, length, WIFI_CONNECT_TIME_OUT); + + // 本机IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 + wifi_spi_get_ip_addr_port(); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块自身 的 MAC 地址 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_mac()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_mac (void) -{ - uint8 return_state = 0; - uint8 receiver_buffer[64]; - uint32 receiver_len = 64; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPAPMAC?\r\n"); - do - { - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - if(wifi_spi_data_parse(wifi_spi_information.mac, receiver_buffer, '"', '"')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块或者目标WIFI 的 IP 地址(取决于模块当前的工作模式) -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_ip()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_ip (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_STATION == wifi_spi_information.mode) - { - wifi_spi_send_command("AT+CIPSTA?\r\n"); - } - else if(WIFI_SPI_SOFTAP == wifi_spi_information.mode) - { - wifi_spi_send_command("AT+CIPAP?\r\n"); - } - - do - { - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - uint8 receiver_buffer[128]; - uint32 receiver_len = 128; - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - if(wifi_spi_data_parse(wifi_spi_information.local_ip, receiver_buffer, '"', '"')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块的相关信息 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_information()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_information (void) -{ - uint8 return_state = 0; - do - { - // 获取模块版本号 - if(wifi_spi_get_version()) - { - return_state = 1; - break; - } - // 获取模块IP地址 - if(wifi_spi_get_ip()) - { - return_state = 1; - break; - } - // 获取模块MAC信息 - if(wifi_spi_get_mac()) - { - return_state = 1; - break; - } - memcpy(wifi_spi_information.local_port, "no port", 7); - }while(0); - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 连接 WiFi -// 参数说明 wifi_ssid WiFi名称 -// 参数说明 pass_word WiFi密码 -// 参数说明 model 0:查询WiFi连接情况 其他:连接WiFi -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_get_or_connect_wifi("WiFi_name", "Pass_word", 1); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_wifi (char *wifi_ssid, char *pass_word) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SOFTAP == wifi_spi_information.mode) - { - sprintf(temp, "AT+CWSAP=\"%s\",\"%s\",5,3\r\n", wifi_ssid, pass_word); - wifi_spi_send_command(temp); - } - else - { - sprintf(temp, "AT+CWJAP=\"%s\",\"%s\"\r\n", wifi_ssid, pass_word); - wifi_spi_send_command(temp); - } - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 上电是否自动连接WiFi -// 参数说明 model 0:上电不自动连接wifi 其他:上电自动连接wifi -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_auto_connect_wifi(0); //上电不自动连接wifi -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_auto_connect_wifi (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CWAUTOCONN=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置连接模式 -// 参数说明 model 0: 单连接模式 1:多连接模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_connect_model("1"); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_connect_model (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPMUX=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置传输模式 -// 参数说明 model – 0: 普通传输模式 IP断开后不重新连接 -// – 1: Wi-Fi 透传接收模式,仅支持 TCP 单连接、UDP 固定通信对端、SSL 单连接的情况 IP断开后会不断尝试重新连接 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_transfer_model("1"); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_transfer_model (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPMODE=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置模块模式 (Station/SoftAP/Station+SoftAP) -// 参数说明 state 0:无 Wi-Fi 模式,并且关闭 Wi-Fi RF----1: Station 模式----2: SoftAP 模式----3: SoftAP+Station 模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_model("1"); +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 设置连接的Socket信息并尝试连接Socket +// 参数说明 *transport_type 传输类型 +// 参数说明 *ip_addr IP地址 +// 参数说明 *port 目标端口号 +// 参数说明 *local_port 本机端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_socket_connect("TCP", "192.168.2.5", "8080", "6060"); // 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_set_model (wifi_spi_mode_enum mode) +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_socket_connect (char *transport_type, char *ip_addr, char *port, char *local_port) { - uint8 return_state = 0; + uint8 return_state; + uint8 temp_buffer[41]; + uint16 length; + + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n%s\r\n%s\r\n%s\r\n", transport_type, ip_addr, port, local_port); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + return_state = wifi_spi_set_parameter(WIFI_SPI_SET_SOCKET_INFORMATION, temp_buffer, length, SOCKET_CONNECT_TIME_OUT); - if(WIFI_SPI_SOFTAP == mode) - { - wifi_spi_send_command("AT+CWMODE=2\r\n"); - } - else - { - wifi_spi_send_command("AT+CWMODE=1\r\n"); - } - // 设置模块工作模式 - wifi_spi_information.mode = mode; - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + // 本机IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 + wifi_spi_get_ip_addr_port(); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 关闭睡眠模式 -// 参数说明 mode -// 返回参数 uint8 0:成功 1:失败 +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 断开Socket连接 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_socket_disconnect(); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_socket_disconnect (void) +{ + wifi_spi_packets_struct temp_packets; + + return wifi_spi_get_parameter(WIFI_SPI_CLOSE_SOCKET, &temp_packets, OTHER_TIME_OUT); +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 软复位 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 // 使用示例 // 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_close_sleep_model (void) +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_reset (void) { - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+SLEEP=0\r\n"); - // 设置模块工作模式 - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 断开与wifi的连接 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_disconnected_wifi(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_disconnected_wifi (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CWQAP\r\n"); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 进入打开透传模式 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_entry_serianet(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_entry_serianet (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPSEND\r\n"); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 退出透传模式 -// 参数说明 model 0:关闭透传模式 其他:开启透传模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_exit_serianet(1); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_exit_serianet (void) -{ - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - system_delay_ms(20); - wifi_spi_send_command("+++"); - system_delay_ms(1000); - - return 0; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 建立TCP连接 -// 参数说明 ip 远端 IPv4 地址、IPv6 地址,或域名 -// 参数说明 port 远端端口值 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_connect_tcp_servers("192.168.101.110", "8080"); -// 备注信息 如果总是连接不上电脑的TCP服务器 可以尝试使用网线连接电脑 -// 如果是使用WiFi连接 可能会导致模块连接TCP服务器等待较长时间 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_connect_tcp_servers (char *ip, char *port, wifi_spi_transfer_mode_enum mode) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + uint8 return_state; + wifi_spi_head_struct head; + return_state = 1; do { - if(wifi_spi_set_connect_model("0")) + head.command = WIFI_SPI_RESET; + head.length = 0xA5A5; + return_state = wifi_spi_wait_idle(OTHER_TIME_OUT); + if(return_state) { - return_state = 1; break; } + wifi_spi_write(&head.command, sizeof(wifi_spi_head_struct), NULL, 0); + }while(0); + + return return_state; +} - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPSTARTEX=\"TCP\",\"%s\",%s\r\n", ip, port); - wifi_spi_send_command(temp); - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI UDP模式时立即发送函数 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 在UDP模式下模块收到数据后会等待2毫秒,2毫秒后未收到数据则将数据通过socket发送到网络,如果希望立即发送则在数据传输完毕后调用此函数 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_udp_send_now (void) +{ + uint8 return_state = 1; + wifi_spi_packets_struct temp_packets; + + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + do { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - // 设置传输模式 - if(wifi_spi_set_transfer_model(WIFI_SPI_COMMAND == mode ? "0" : "1")) - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPSTATE?\r\n"); - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - else - { - uint8 receiver_buffer[128]; - uint32 receiver_len = 128; - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - char* buffer_index = (char *)receiver_buffer; - char* end_index; - - buffer_index += 22; - buffer_index += strlen(ip); - buffer_index += strlen(port); - end_index = strchr(buffer_index, ','); - - memcpy(wifi_spi_information.local_port, " ", 7); - memcpy(wifi_spi_information.local_port, buffer_index, (end_index - buffer_index)); - } - - wifi_spi_information.connect_state = WIFI_SPI_SERVER_ON; - wifi_spi_information.connect_mode = WIFI_SPI_TCP_CLIENT; - wifi_spi_information.transfer_mode = mode; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SERIANET == mode) // 透传模式下直接开启透传 - { - if(wifi_spi_entry_serianet()) + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) { - return_state = 1; break; } - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 建立UDP连接 -// 参数说明 *ip 远端 IPv4 地址、IPv6 地址 或域名 字符串形式 -// 参数说明 *port 远端端口值 字符串形式 -// 参数说明 *local_port 远端 IPv4 地址、IPv6 地址 或域名 字符串形式 -// 参数说明 mode 模块数据通信模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_connect_udp_client("192.168.101.110", "8080", "8080", WIFI_SPI_COMMAND); -// 备注信息 自动分配ID -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_connect_udp_client (char *ip, char *port, char *local_port, wifi_spi_transfer_mode_enum mode) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - do - { - if(wifi_spi_set_connect_model("0")) - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + // 立即开始socket发送 + temp_packets.head.command = WIFI_SPI_UDP_SEND; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + + // 等待应答信号 + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + + // 接收应答信号 + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, temp_packets.head.length); + + if(WIFI_SPI_REPLY_OK == temp_packets.head.command) + { + return_state = 0; + } + + }while(0); - sprintf(temp, "AT+CIPSTARTEX=\"UDP\",\"%s\",%s,%s\r\n", ip, port, local_port); - wifi_spi_send_command(temp); + // 将通讯状态设置为空闲 + wifi_spi_mutex = WIFI_SPI_IDLE; + } + + return return_state; +} - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 数据块发送函数并同步接收数据 +// 参数说明 *buff 需要发送的数据地址 +// 参数说明 length 发送长度 +// 返回参数 uint32 剩余未发送的长度 +// 使用示例 wifi_spi_send_buffer(buffer, 100); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +uint32 wifi_spi_send_buffer (const uint8 *buffer, uint32 length) +{ + uint16 send_length; + wifi_spi_packets_struct temp_packets; + + // 检查WIFI SPI状态,如果在其他中断或者线程中已经发起了通讯,则本次不能发送数据 + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + + while(length) { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_spi_set_transfer_model(WIFI_SPI_COMMAND == mode ? "0" : "1")) // 设置传输模式 - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SERIANET == mode) // 透传模式下直接开启透传 - { - if(wifi_spi_entry_serianet()) + send_length = length > WIFI_SPI_TRANSFER_SIZE ? (uint16)WIFI_SPI_TRANSFER_SIZE : (uint16)length; + + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) { - return_state = 1; break; } - } - memcpy(wifi_spi_information.local_port, " ", 7); - memcpy(wifi_spi_information.local_port, local_port, strlen(local_port)); - wifi_spi_information.connect_state = WIFI_SPI_SERVER_ON; - wifi_spi_information.connect_mode = WIFI_SPI_UDP_CLIENT; - wifi_spi_information.transfer_mode = mode; - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 断开连接 TCP Server 使用本接口将会断开所有连接 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_disconnect_link(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_disconnect_link (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - do - { - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - wifi_spi_send_command("AT+CIPCLOSE=5\r\n"); - } - else - { - wifi_spi_send_command("AT+CIPCLOSE\r\n"); - } - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送字节函数 -// 参数说明 data 需要发送的数据 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_byte(0xa5); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_byte (uint8 data) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - send_length = 1; - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data(&data, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else - { - send_length = (uint16)wifi_spi_write_data(&data, send_length); - } - } - } - - return send_length; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送缓冲区函数 -// 参数说明 buff 需要发送的数据地址 -// 参数说明 len 发送长度 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_buffer("123", 3); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 len) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - while(len) - { - if((WIFI_SPI_WRITE_MAX * 2) < len) send_length = WIFI_SPI_WRITE_MAX * 2; - else - { - send_length = (uint16)len; - } - len -= send_length; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data(buff, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } - buff += send_length; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else - { - len = wifi_spi_write_data(buff, len); - } - } - } - - return len; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送缓冲区函数(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 -// 备注信息 需要发送多个数组时,采用此函数可以极大的降低通讯时间,发送数据总长度不能超过4092 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_buffer_multi (wifi_spi_send_multi_struct *multi_buffer) -{ - uint8 i; - uint16 remain_length; - - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - for(i = 0; i < WIFI_SPI_MAX_MULTI; i++) - { - if(multi_buffer->source[i]) wifi_spi_send_buffer(multi_buffer->source[i], multi_buffer->length[i]); - } - } - else - { - remain_length = (uint16)wifi_spi_write_data_multi(multi_buffer); - } - } - } - - return remain_length; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送字符串函数 -// 参数说明 *str 需要发送的数据 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_string("123"); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_string (const char *str) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - send_length = (uint16)strlen(str); - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data((uint8 *)str, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } + wifi_spi_transfer_data(buffer, &temp_packets, send_length); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) { - send_length = (uint16)wifi_spi_write_data((uint8 *)str, send_length); + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + + length -= send_length; + buffer += send_length; + } + + // 检查最后一次的接收是否将所有的数据都接收完毕 + while(WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) + { + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + + // 继续读取模块剩余数据 + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } } } + wifi_spi_mutex = WIFI_SPI_IDLE; } - - return send_length; + return length; } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi 模块数据接收函数 -// 参数说明 buffer 接收数据的存放地址 -// 参数说明 len 数组长度,可直接填写或者使用sizeof求得 -// 返回参数 uint32 返回实际接收到的数据长度 -// 使用示例 uint8 test_buffer[256]; wifi_spi_read_buffer(&test_buffer[0], sizeof(test_buffer)); +// 函数简介 WIFI SPI 读取缓冲区 +// 参数说明 *buff 接收缓冲区 +// 参数说明 length 读取数据长度 +// 返回参数 uint32 实际读取数据长度 +// 使用示例 wifi_spi_read_buffer(buffer, 100); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 len) +uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 length) { - fifo_read_buffer(&wifi_spi_fifo, buffer, &len, FIFO_READ_AND_CLEAN); - return len; + zf_assert(NULL != buffer); + uint32 data_len = length; + +#if(1 == WIFI_SPI_READ_TRANSFER) + + wifi_spi_packets_struct temp_packets; + // 检查WIFI SPI状态,如果在其他中断或者线程中已经发起了通讯,则本次不能发送数据 + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + + // 发起通讯查看模块内是否有数据未读取 + do + { + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + }while(WIFI_SPI_REPLY_DATA_START == temp_packets.head.command); + wifi_spi_mutex = WIFI_SPI_IDLE; + } +#endif + + fifo_read_buffer(&wifi_spi_fifo, buffer, &data_len, FIFO_READ_AND_CLEAN); + return data_len; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 wifi spi handshake中断回调函数 -// 参数说明 void -// 返回参数 void -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -void wifi_spi_callback (void) -{ - wifi_spi_check_state_read_buffer(); - wifi_spi_ack_flag = 1; // ACK标志位置1 -} - - //------------------------------------------------------------------------------------------------------------------- // 函数简介 WiFi 模块初始化 // 参数说明 *wifi_ssid 目标连接的 WiFi 的名称 字符串形式 // 参数说明 *pass_word 目标连接的 WiFi 的密码 字符串形式 -// 参数说明 wifi_mode 模块的工作模式 参照 zf_device_wireless_spi.h 中 wifi_spi_mode_enum 枚举 // 返回参数 uint8 模块初始化状态 0-成功 1-错误 -// 使用示例 wifi_spi_init("SEEKFREE_2.4G", "SEEKFREEV2", WIFI_UART_STATION); -// 备注信息 初始化会首先设置串口配置,之后会对模块进行基本参数配置 -// 具体的配置信息可以在 zf_device_wireless_spi.h 文件中修改 +// 使用示例 wifi_spi_init("SEEKFREE", "SEEKFREE123"); +// 备注信息 wifi_spi_init("SEEKFREE", NULL); // 连接没有密码的WIFI热点 //------------------------------------------------------------------------------------------------------------------- -uint8 wifi_spi_init (char *wifi_ssid, char *pass_word, wifi_spi_mode_enum wifi_mode) +uint8 wifi_spi_init (char *wifi_ssid, char *pass_word) { uint8 return_state = 0; - uint32 temp_isr; - - spi_init(WIFI_SPI_INDEX, SPI_MODE0, WIFI_SPI_SPEED, WIFI_SPI_SCK_PIN, WIFI_SPI_MOSI_PIN, WIFI_SPI_MISO_PIN, SPI_CS_NULL);//硬件SPI初始化 - set_wireless_type(WIFI_SPI, wifi_spi_callback); - fifo_init(&wifi_spi_fifo, FIFO_DATA_8BIT, wifi_spi_buffer, WIFI_SPI_BUFFER_SIZE); + fifo_init(&wifi_spi_fifo, FIFO_DATA_8BIT, wifi_spi_buffer, WIFI_SPI_RECVIVE_FIFO_SIZE); + spi_init(WIFI_SPI_INDEX, SPI_MODE3, WIFI_SPI_SPEED, WIFI_SPI_SCK_PIN, WIFI_SPI_MOSI_PIN, WIFI_SPI_MISO_PIN, SPI_CS_NULL);//硬件SPI初始化 gpio_init(WIFI_SPI_CS_PIN, GPO, 1, GPO_PUSH_PULL); gpio_init(WIFI_SPI_RST_PIN, GPO, 1, GPO_PUSH_PULL); - - temp_isr = interrupt_global_disable(); - - exti_init(WIFI_SPI_INT_PIN, EXTI_TRIGGER_RISING); - + gpio_init(WIFI_SPI_INT_PIN, GPI, 0, GPI_PULL_DOWN); + + // 复位 gpio_set_level(WIFI_SPI_RST_PIN, 0); - system_delay_ms(50); + system_delay_ms(10); gpio_set_level(WIFI_SPI_RST_PIN, 1); - system_delay_ms(1000); + + // 等待模块初始化 + system_delay_ms(100); + wifi_spi_mutex = WIFI_SPI_IDLE; - exti_flag_clear(WIFI_SPI_INT_PIN); - - interrupt_global_enable(temp_isr); do { - if(wifi_spi_echo_set("0")) // 关闭模块回写 + // 固件版本信息以字符串形式保存在wifi_spi_version数组中 + return_state = wifi_spi_get_version(); + if(return_state) + { + break; + } + + // MAC地址信息以字符串形式保存在wifi_spi_mac_addr数组中 + wifi_spi_get_mac_addr(); + + + return_state = wifi_spi_wifi_connect(wifi_ssid, pass_word); + if(return_state) { - zf_log(0, "exit echo failed"); - return_state = 1; break; } - if(wifi_spi_auto_connect_wifi("0")) // 关闭自动连接 + #if(1 == WIFI_SPI_AUTO_CONNECT) + return_state = wifi_spi_socket_connect("TCP", WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT); + if(return_state) { - zf_log(0, "close auto connect failed"); - return_state = 1; break; } - - if(wifi_spi_set_model(wifi_mode)) // 设置运行模式 + #endif + + #if(2 == WIFI_SPI_AUTO_CONNECT) + return_state = wifi_spi_socket_connect("UDP", WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT); + if(return_state) { - zf_log(0, "set run mode failed"); - return_state = 1; break; } - - if(wifi_spi_close_sleep_model()) // 关闭睡眠模式 - { - zf_log(0, "set sleep mode failed"); - return_state = 1; - break; - } - - if(wifi_spi_set_wifi((char *)wifi_ssid, (char *)pass_word)) // 连接 wifi 或者开启热点 - { - zf_log(0, "wifi set failed"); - return_state = 1; - break; - } - - if(wifi_spi_get_information()) // 模块基本参数获取 - { - zf_log(0, "get module information failed"); - return_state = 1; - break; - } -#if WIFI_SPI_AUTO_CONNECT == 1 - if(wifi_spi_connect_tcp_servers(WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_SERIANET)) // 连接TCP服务器 - { - zf_log(0, "connect TCP server failed"); - return_state = 1; - break; - } -#endif -#if WIFI_SPI_AUTO_CONNECT == 2 - if(wifi_spi_connect_udp_client(WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT, WIFI_SPI_SERIANET)) // 建立UDP连接 - { - zf_log(0, "connect UDP server failed"); - return_state = 1; - break; - } -#endif - // 模块初始化成功 - wifi_spi_init_flag = 1; + #endif }while(0); - + return return_state; } diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_wifi_spi.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_wifi_spi.h index 5e5a025..24e7eb1 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_wifi_spi.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_wifi_spi.h @@ -24,13 +24,13 @@ * 文件名称 zf_device_wifi_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 * 日期 作者 备注 -* 2023-05-27 pudding first version +* 2024-01-18 SeekFree first version ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,128 +53,100 @@ #include "zf_common_typedef.h" + #define WIFI_SPI_INDEX (SPI_3 ) // 定义使用的SPI号 -#define WIFI_SPI_SPEED (30 * 1000 * 1000 ) // 硬件 SPI 速率 +#define WIFI_SPI_SPEED (50 * 1000 * 1000 ) // 硬件 SPI 速率 #define WIFI_SPI_SCK_PIN (SPI3_SCLK_P22_3 ) // 定义SPI_SCK引脚 #define WIFI_SPI_MOSI_PIN (SPI3_MOSI_P22_0 ) // 定义SPI_MOSI引脚 #define WIFI_SPI_MISO_PIN (SPI3_MISO_P22_1 ) // 定义SPI_MISO引脚 IPS没有MISO引脚,但是这里任然需要定义,在spi的初始化时需要使用 #define WIFI_SPI_CS_PIN (P22_2 ) // 定义SPI_CS引脚 采用软件CS引脚 -#define WIFI_SPI_INT_PIN (ERU_CH5_REQ1_P15_8) // 定义中断引脚 +#define WIFI_SPI_INT_PIN (P15_8 ) // 定义握手引脚 #define WIFI_SPI_RST_PIN (P23_1 ) // 定义复位引脚 - - -#define WIFI_SPI_BUFFER_SIZE (1024) // 定义SPI接收的缓冲区大小 -#define WIFI_SPI_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不连接 1-自动连接TCP服务器并进入透传模式 2-自动连接UDP服务器并进入透传模式 3:自动建立TCP服务器 - -#if (WIFI_SPI_AUTO_CONNECT > 2) + +#define WIFI_SPI_RECVIVE_FIFO_SIZE (1024) // 接收FIFO大小 +#define WIFI_SPI_READ_TRANSFER (1) // 在调用wifi_spi_read_buffer 是否尝试发起SPI通讯来检测模块内是否有数据需要读取 1:发起SPI通讯 0:不发起SPI通讯,仅读取FIFO + // 如果应用程序中没有任何的地方调用发送函数,则WIFI_SPI_READ_TRANSFER必须设置为1 + +#define WIFI_SPI_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不自动连接 1-自动连接TCP服务器 2-自动连接UDP + +#if (WIFI_SPI_AUTO_CONNECT > 2) #error "WIFI_SPI_AUTO_CONNECT 的值只能为 [0,1,2]" #else -#define WIFI_SPI_TARGET_IP "192.168.2.28" // 连接目标的 IP +#define WIFI_SPI_TARGET_IP "192.168.137.1" // 连接目标的 IP #define WIFI_SPI_TARGET_PORT "8080" // 连接目标的端口 -#define WIFI_SPI_LOCAL_PORT "8080" // 本机端口 +#define WIFI_SPI_LOCAL_PORT "6666" // 本机的端口 0:随机 可设置范围2048-65535 默认 6666 #endif -#define WIFI_SPI_MAX_MULTI (17) // 多地址发送,最大8个地址 -typedef enum -{ - BUFFER_IDLE, // 模块的缓冲区是空闲的 - BUFFER_READ, // 模块的缓冲区有数据需要读取 - BUFFER_WRITE, // 模块的缓冲区是可写的 -}wifi_spi_buffer_state_enum; +#define WIFI_SPI_RECVIVE_SIZE (32) // 每次SPI传输接收的字节数 不允许修改 +#define WIFI_SPI_TRANSFER_SIZE (4088) // 最大SPI传输接收的字节数 不允许修改 + + typedef enum -{ - TRANSMIT_IDLE, // 当前没有传输 - TRANSMIT_WRITE_REQUEST, // 给模块发送了一个传输请求 - TRANSMIT_READ_STATE, // 读取模块状态 - TRANSMIT_READ, // 正在读取模块内部数据 - TRANSMIT_WRITE, // 正在往模块写入数据 -}wifi_spi_transmit_state_enum; - -typedef enum -{ - WIFI_SPI_STATION, // 设备模式 - WIFI_SPI_SOFTAP, // AP模式 -}wifi_spi_mode_enum; - -typedef enum -{ - WIFI_SPI_COMMAND, // 使用命令的方式发送数据 - WIFI_SPI_SERIANET, // 使用透传的方式发送数据 -}wifi_spi_transfer_mode_enum; - -typedef enum -{ - WIFI_SPI_TCP_CLIENT, // 模块连接TCP服务器 - WIFI_SPI_TCP_SERVER, // 模块作为TCP服务器 - WIFI_SPI_UDP_CLIENT, // 模块启用UDP连接 -}wifi_spi_connect_mode_enum; - -typedef enum -{ - WIFI_SPI_SERVER_OFF, // 模块未连接服务器 - WIFI_SPI_SERVER_ON, // 模块已经连接服务器 -}wifi_spi_connect_state_enum; - -typedef enum -{ - WIFI_SPI_LINK_0, // 模块当前链接 0 - WIFI_SPI_LINK_1, // 模块当前链接 1 - WIFI_SPI_LINK_2, // 模块当前链接 2 - WIFI_SPI_LINK_3, // 模块当前链接 3 - WIFI_SPI_LINK_4, // 模块当前链接 4 -}wifi_spi_link_id_enum; - -typedef struct { - uint8 reserve; - uint8 cmd; - uint8 addr; - uint8 dummy; - uint8 magic; - uint8 sequence; - uint16 length; -}wifi_spi_buffer_struct; + // 主机发送的命令 + WIFI_SPI_INVALID1 = 0x00, // 无效数据包 + WIFI_SPI_RESET = 0x01, // 复位命令 + WIFI_SPI_DATA = 0x02, // 透传数据包 + WIFI_SPI_UDP_SEND = 0x03, // UDP下立即发送命令,默认SPI接收数据后2MS未收到数据自动发送数据 + WIFI_SPI_CLOSE_SOCKET = 0x04, // 断开连接 + + WIFI_SPI_SET_WIFI_INFORMATION = 0x10, // 设置WIFI信息命令 + WIFI_SPI_SET_SOCKET_INFORMATION = 0x11, // 设置SOCKET信息命令 + + WIFI_SPI_GET_VERSION = 0x20, // 获取模块版本 + WIFI_SPI_GET_MAC_ADDR = 0x21, // 获取模块MAC地址 + WIFI_SPI_GET_IP_ADDR = 0x22, // 获取模块IP地址 + + // 从机回传的命令 + WIFI_SPI_REPLY_OK = 0x80, // 从机应答的正确命令 + WIFI_SPI_REPLY_ERROR = 0x81, // 从机应答的错误命令 + + WIFI_SPI_REPLY_DATA_START = 0x90, // 从机回传的数据包,并且还有数据需要主机读取 + WIFI_SPI_REPLY_DATA_END = 0x91, // 从机回传的数据包,数据已读取完毕 + + WIFI_SPI_REPLY_VERSION = 0xA0, // 从机回复固件版本 + WIFI_SPI_REPLY_MAC_ADDR = 0xA1, // 从机回复本机MAC地址等信息 + WIFI_SPI_REPLY_IP_ADDR = 0xA2, // 从机回复本机IP地址、端口号 + WIFI_SPI_INVALID2 = 0xFF // 无效数据包 +}wifi_spi_packets_command_enum; + +typedef enum +{ + WIFI_SPI_IDLE, // 模块空闲,可以进行SPI通讯 + WIFI_SPI_BUSY, // 模块正忙,不可进行SPI通讯 +}wifi_spi_state_enum; + + +typedef struct +{ + uint8 command; // 命令字 + uint8 reserve; // 保留 + uint16 length; // 包有效长度 +}wifi_spi_head_struct; + + +typedef struct +{ + wifi_spi_head_struct head; // 帧头 + uint8 buffer[WIFI_SPI_RECVIVE_SIZE]; // 缓冲区 +}wifi_spi_packets_struct; + + +extern char wifi_spi_version[12]; // 固件版本 字符串 +extern char wifi_spi_mac_addr[20]; // 模块MAC地址 字符串 +extern char wifi_spi_ip_addr_port[25]; // IP地址与端口号 字符串 -typedef struct -{ - uint8 version[12]; // 固件版本 字符串形式 - uint8 mac[20]; // 本机 MAC 地址 字符串形式 - uint8 local_ip[17]; // 本机 IP 地址 字符串形式 - uint8 local_port[10]; // 本机端口号 字符串形式 - uint8 remote_ip[5][17]; // 远端 IP 地址 字符串形式 - wifi_spi_mode_enum mode; // WIFI 模式 - wifi_spi_transfer_mode_enum transfer_mode; // 当前传输模式 - wifi_spi_connect_mode_enum connect_mode; // 网络连接模式 - wifi_spi_connect_state_enum connect_state; // 服务器连接情况 -}wifi_spi_information_struct; +uint8 wifi_spi_wifi_connect (char *wifi_ssid, char *pass_word); +uint8 wifi_spi_socket_connect (char *transport_type, char *ip_addr, char *port, char *local_port); +uint8 wifi_spi_socket_disconnect (void); +uint8 wifi_spi_udp_send_now (void); +uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 length); +uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 length); -typedef struct -{ - uint8 *source[WIFI_SPI_MAX_MULTI]; - uint16 length[WIFI_SPI_MAX_MULTI]; -}wifi_spi_send_multi_struct; - -extern wifi_spi_information_struct wifi_spi_information; - - -uint8 wifi_spi_disconnected_wifi (void); // 断开 WIFI 连接 -uint8 wifi_spi_entry_serianet (void); // 打开透传模式 -uint8 wifi_spi_exit_serianet (void); // 关闭透传模式 - -uint8 wifi_spi_connect_tcp_servers (char *ip, char *port, wifi_spi_transfer_mode_enum mode); // 建立 TCP 连接 -uint8 wifi_spi_connect_udp_client (char *ip, char *port, char *local_port, wifi_spi_transfer_mode_enum mode); // 建立 UDP 传输 -uint8 wifi_spi_disconnect_link (void); // 断开连接 TCP Server 使用本接口将会断开所有连接 - -uint32 wifi_spi_send_byte (uint8 data); // WIFI 模块发送字节函数 -uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 length); // WIFI 模块发送缓冲区函数 -uint32 wifi_spi_send_buffer_multi (wifi_spi_send_multi_struct *multi_buffer); // WIFI 模块发送多缓冲区函数 -uint32 wifi_spi_send_string (const char *str); // WIFI 模块发送字符串函数 - -uint32 wifi_spi_read_buffer (uint8 *buff, uint32 len); // WIFI 模块数据接收函数 - -uint8 wifi_spi_init (char *wifi_ssid, char *pass_word, wifi_spi_mode_enum wifi_mode); // WIFI 模块初始化函数 +uint8 wifi_spi_init (char *wifi_ssid, char *pass_word); #endif + diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_wifi_uart.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_wifi_uart.c index 312dab7..ff728bb 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_wifi_uart.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_wifi_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_wifi_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -61,7 +61,7 @@ wifi_uart_information_struct wifi_uart_information; // 模块自身参数 -static fifo_obj_struct wifi_uart_fifo; +static fifo_struct wifi_uart_fifo; static uint8 wifi_uart_buffer[WIFI_UART_BUFFER_SIZE]; // 数据存放数组 static uint8 wifi_uart_data; diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_wifi_uart.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_wifi_uart.h index abcb253..3316b6f 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_wifi_uart.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_wifi_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_wifi_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_wireless_uart.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_wireless_uart.c index eac2867..91ec013 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_wireless_uart.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_wireless_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_wireless_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -53,7 +53,7 @@ #include "zf_device_type.h" #include "zf_device_wireless_uart.h" -static fifo_obj_struct wireless_uart_fifo; +static fifo_struct wireless_uart_fifo; static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; static uint8 wireless_uart_data = 0; diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_wireless_uart.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_wireless_uart.h index 2418545..a789ad0 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_wireless_uart.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_wireless_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_wireless_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -61,11 +61,11 @@ // 注意事项2:开启自动波特率务必连接RTS引脚 否则会开启失败。 // 注意事项3:模块自动波特率失败的话 可以尝试断电重启 -// 开启自动波特率务必阅读上面两条 注意事项 -// 开启自动波特率务必阅读上面两条 注意事项 -// 开启自动波特率务必阅读上面两条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 -// 0:关闭自动波特率 +// 0:关闭自动波特率 // 1:开启自动波特率 自动波特率的作用是修改 WIRELESS_UART_BAUD 之后不需要对模块进行配置 模块会自动设置为对应的波特率 #define WIRELESS_UART_AUTO_BAUD_RATE ( 1 ) diff --git a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_adc.c b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_adc.c index 9a262a1..06694d8 100644 --- a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_adc.c +++ b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_adc.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_adc * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_adc.h b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_adc.h index 378b67e..f017c76 100644 --- a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_adc.h +++ b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_adc.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_adc * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_delay.c b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_delay.c index 4ec533c..ae3e610 100644 --- a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_delay.c +++ b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_delay.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_delay * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_delay.h b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_delay.h index e8d82ef..7b8b475 100644 --- a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_delay.h +++ b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_delay.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_delay * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_dma.c b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_dma.c index f72f1d6..43bffbc 100644 --- a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_dma.c +++ b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_dma.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_dma * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_dma.h b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_dma.h index 1ec555b..320d40c 100644 --- a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_dma.h +++ b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_dma.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_dma * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_encoder.c b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_encoder.c index 6592198..0e0e0b9 100644 --- a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_encoder.c +++ b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_encoder.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_encoder.h b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_encoder.h index 68d159f..e079122 100644 --- a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_encoder.h +++ b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_encoder.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_exti.c b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_exti.c index 72c9a1f..31d270a 100644 --- a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_exti.c +++ b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_exti.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_exti * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_exti.h b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_exti.h index 30f5ef6..b63f9ee 100644 --- a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_exti.h +++ b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_exti.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_exti * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_flash.c b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_flash.c index f91f5a0..325cfed 100644 --- a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_flash.c +++ b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_flash.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_flash * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_flash.h b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_flash.h index 912585a..e7425fd 100644 --- a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_flash.h +++ b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_flash.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_flash * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_gpio.c b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_gpio.c index 5071114..a084353 100644 --- a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_gpio.c +++ b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_gpio.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_gpio * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_gpio.h b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_gpio.h index 2b23be0..550fb8d 100644 --- a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_gpio.h +++ b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_gpio.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_gpio * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_pit.c b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_pit.c index c4dc50d..5e03d38 100644 --- a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_pit.c +++ b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_pit.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pit * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_pit.h b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_pit.h index 5461e05..66854b5 100644 --- a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_pit.h +++ b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_pit.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pit * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_pwm.c b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_pwm.c index ad1059a..24d8d7a 100644 --- a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_pwm.c +++ b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_pwm.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pwm * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_pwm.h b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_pwm.h index d6dce78..51948a4 100644 --- a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_pwm.h +++ b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_pwm.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pwm * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_soft_iic.c b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_soft_iic.c index 9833b62..a349ec7 100644 --- a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_soft_iic.c +++ b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_soft_iic.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_iic * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_soft_iic.h b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_soft_iic.h index a62b262..80db53b 100644 --- a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_soft_iic.h +++ b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_soft_iic.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_iic * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_soft_spi.c b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_soft_spi.c index 292c60b..954fbe3 100644 --- a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_soft_spi.c +++ b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_soft_spi.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_soft_spi.h b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_soft_spi.h index 6a9c207..62858de 100644 --- a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_soft_spi.h +++ b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_soft_spi.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_spi.c b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_spi.c index 1b99196..f817dd9 100644 --- a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_spi.c +++ b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_spi.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -920,7 +920,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 do { - IfxQspi_writeTransmitFifo(moudle, (uint8)(*write_buffer & 0xFF00) >> 8); // 将发送的数据写入缓冲区 + IfxQspi_writeTransmitFifo(moudle, (uint8)((*write_buffer & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 if(read_buffer != NULL) { diff --git a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_spi.h b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_spi.h index e73507e..d15589c 100644 --- a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_spi.h +++ b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_spi.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_timer.c b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_timer.c index a953b92..e085d6e 100644 --- a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_timer.c +++ b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_timer.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_timer * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_timer.h b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_timer.h index 3c86f58..1bb348f 100644 --- a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_timer.h +++ b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_timer.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_timer * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_uart.c b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_uart.c index cd19782..fb89b55 100644 --- a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_uart.c +++ b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_uart.h b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_uart.h index 8d1d111..cdc55ab 100644 --- a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_uart.h +++ b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E07_encoder_demo/user/isr.c b/Example/E07_encoder_demo/user/isr.c index f81ccb2..a419ee6 100644 --- a/Example/E07_encoder_demo/user/isr.c +++ b/Example/E07_encoder_demo/user/isr.c @@ -24,7 +24,7 @@ * 文件名称 isr * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -118,7 +118,7 @@ IFX_INTERRUPT(exti_ch1_ch5_isr, 0, EXTI_CH1_CH5_INT_PRIO) { exti_flag_clear(ERU_CH5_REQ1_P15_8); - wireless_module_spi_handler(); // SPI WIFI 中断回调函数 + } } diff --git a/Example/E08_eeprom_demo/libraries/doc/version.txt b/Example/E08_eeprom_demo/libraries/doc/version.txt index b841b50..d644136 100644 --- a/Example/E08_eeprom_demo/libraries/doc/version.txt +++ b/Example/E08_eeprom_demo/libraries/doc/version.txt @@ -1,3 +1,8 @@ +V3.2.6 + 更新逐飞助手接口函数 调用初始化时直接传参通信类 + 更新wifi SPI驱动文件 提高通信效率 + 更新GPS驱动文件,更名为GNSS,兼容普通定位模块及RTK + V3.2.5 修复延时函数初始化参数及中断向量表问题 V3.2.4 diff --git a/Example/E08_eeprom_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h b/Example/E08_eeprom_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h index 28ff689..371e6b6 100644 --- a/Example/E08_eeprom_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h +++ b/Example/E08_eeprom_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h @@ -34,7 +34,7 @@ /*------------------------------------------Configuration for IfxScu_cfg.h-------------------------------------------*/ /*********************************************************************************************************************/ /* External oscillator frequency in Hz */ -#define IFX_CFG_SCU_XTAL_FREQUENCY (20000000) /* Allowed values are: 16000000, 20000000 or 40000000 */ +#define IFX_CFG_SCU_XTAL_FREQUENCY (20000000) /* Allowed values are9p: 16000000, 20000000 or 40000000 */ /* PLL frequency in Hz */ #define IFX_CFG_SCU_PLL_FREQUENCY (200000000) /* Allowed values are: 80000000, 133000000, 160000000 * or 200000000 */ diff --git a/Example/E08_eeprom_demo/libraries/zf_common/zf_common_clock.c b/Example/E08_eeprom_demo/libraries/zf_common/zf_common_clock.c index 5023270..9872ea9 100644 --- a/Example/E08_eeprom_demo/libraries/zf_common/zf_common_clock.c +++ b/Example/E08_eeprom_demo/libraries/zf_common/zf_common_clock.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_clock * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_common/zf_common_clock.h b/Example/E08_eeprom_demo/libraries/zf_common/zf_common_clock.h index 9face65..2b50396 100644 --- a/Example/E08_eeprom_demo/libraries/zf_common/zf_common_clock.h +++ b/Example/E08_eeprom_demo/libraries/zf_common/zf_common_clock.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_clock * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_common/zf_common_debug.c b/Example/E08_eeprom_demo/libraries/zf_common/zf_common_debug.c index 52c623d..d680265 100644 --- a/Example/E08_eeprom_demo/libraries/zf_common/zf_common_debug.c +++ b/Example/E08_eeprom_demo/libraries/zf_common/zf_common_debug.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_debug * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -46,7 +46,7 @@ static volatile uint8 zf_debug_assert_enable = 1; #if DEBUG_UART_USE_INTERRUPT // 如果启用 debug uart 接收中断 uint8 debug_uart_buffer[DEBUG_RING_BUFFER_LEN]; // 数据存放数组 uint8 debug_uart_data; -fifo_obj_struct debug_uart_fifo; +fifo_struct debug_uart_fifo; #endif //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E08_eeprom_demo/libraries/zf_common/zf_common_debug.h b/Example/E08_eeprom_demo/libraries/zf_common/zf_common_debug.h index 881a297..4fb4d91 100644 --- a/Example/E08_eeprom_demo/libraries/zf_common/zf_common_debug.h +++ b/Example/E08_eeprom_demo/libraries/zf_common/zf_common_debug.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_debug * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_common/zf_common_fifo.c b/Example/E08_eeprom_demo/libraries/zf_common/zf_common_fifo.c index b010d3e..94f5133 100644 --- a/Example/E08_eeprom_demo/libraries/zf_common/zf_common_fifo.c +++ b/Example/E08_eeprom_demo/libraries/zf_common/zf_common_fifo.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_fifo * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -45,7 +45,7 @@ // 使用示例 fifo_head_offset(fifo, 1); // 备注信息 本函数在文件内部调用 用户不用关注 也不可修改 //------------------------------------------------------------------------------------------------------------------- -static void fifo_head_offset (fifo_obj_struct *fifo, uint32 offset) +static void fifo_head_offset (fifo_struct *fifo, uint32 offset) { fifo->head += offset; @@ -63,7 +63,7 @@ static void fifo_head_offset (fifo_obj_struct *fifo, uint32 offset) // 使用示例 fifo_end_offset(fifo, 1); // 备注信息 本函数在文件内部调用 用户不用关注 也不可修改 //------------------------------------------------------------------------------------------------------------------- -static void fifo_end_offset (fifo_obj_struct *fifo, uint32 offset) +static void fifo_end_offset (fifo_struct *fifo, uint32 offset) { fifo->end += offset; @@ -80,7 +80,7 @@ static void fifo_end_offset (fifo_obj_struct *fifo, uint32 offset) // 使用示例 fifo_clear(fifo); // 备注信息 清空当前 FIFO 对象的内存 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_clear (fifo_obj_struct *fifo) +fifo_state_enum fifo_clear (fifo_struct *fifo) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -113,7 +113,7 @@ fifo_state_enum fifo_clear (fifo_obj_struct *fifo) // 使用示例 uint32 len = fifo_used(fifo); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 fifo_used (fifo_obj_struct *fifo) +uint32 fifo_used (fifo_struct *fifo) { zf_assert(fifo != NULL); return (fifo->max - fifo->size); // 返回当前 FIFO 缓冲区中数据个数 @@ -127,7 +127,7 @@ uint32 fifo_used (fifo_obj_struct *fifo) // 使用示例 zf_log(fifo_write_element(&fifo, data) == FIFO_SUCCESS, "fifo_write_byte error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat) +fifo_state_enum fifo_write_element (fifo_struct *fifo, uint32 dat) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -171,7 +171,7 @@ fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat) // 使用示例 zf_log(fifo_write_buffer(&fifo, data, 32) == FIFO_SUCCESS, "fifo_write_buffer error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 length) +fifo_state_enum fifo_write_buffer (fifo_struct *fifo, void *dat, uint32 length) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -286,7 +286,7 @@ fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 leng // 使用示例 zf_log(fifo_read_element(&fifo, data, FIFO_READ_ONLY) == FIFO_SUCCESS, "fifo_read_byte error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operation_enum flag) +fifo_state_enum fifo_read_element (fifo_struct *fifo, void *dat, fifo_operation_enum flag) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -348,7 +348,7 @@ fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operat // 使用示例 zf_log(fifo_read_buffer(&fifo, data, &length, FIFO_READ_ONLY) == FIFO_SUCCESS, "fifo_read_buffer error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) +fifo_state_enum fifo_read_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) { zf_assert(NULL != fifo); zf_assert(NULL != length); @@ -447,7 +447,7 @@ fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *leng // 如果使用 FIFO_READ_AND_CLEAN 操作 将会丢弃所有数据并清空整个 FIFO // 如果使用 FIFO_READ_AND_CLEAN 操作 将会丢弃所有数据并清空整个 FIFO //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) +fifo_state_enum fifo_read_tail_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) { zf_assert(NULL != fifo); zf_assert(NULL != length); @@ -541,7 +541,7 @@ fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 // 使用示例 fifo_init(&user_fifo, user_buffer, 64); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_init (fifo_obj_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size) +fifo_state_enum fifo_init (fifo_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; diff --git a/Example/E08_eeprom_demo/libraries/zf_common/zf_common_fifo.h b/Example/E08_eeprom_demo/libraries/zf_common/zf_common_fifo.h index 5cc7668..901a913 100644 --- a/Example/E08_eeprom_demo/libraries/zf_common/zf_common_fifo.h +++ b/Example/E08_eeprom_demo/libraries/zf_common/zf_common_fifo.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_fifo * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -91,17 +91,17 @@ typedef struct uint32 end; // 缓存尾指针 总是指向非空缓存(缓存全空除外) uint32 size; // 缓存剩余大小 uint32 max; // 缓存总大小 -}fifo_obj_struct; +}fifo_struct; -fifo_state_enum fifo_clear (fifo_obj_struct *fifo); -uint32 fifo_used (fifo_obj_struct *fifo); +fifo_state_enum fifo_clear (fifo_struct *fifo); +uint32 fifo_used (fifo_struct *fifo); -fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat); -fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 length); -fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operation_enum flag); -fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); -fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); +fifo_state_enum fifo_write_element (fifo_struct *fifo, uint32 dat); +fifo_state_enum fifo_write_buffer (fifo_struct *fifo, void *dat, uint32 length); +fifo_state_enum fifo_read_element (fifo_struct *fifo, void *dat, fifo_operation_enum flag); +fifo_state_enum fifo_read_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); +fifo_state_enum fifo_read_tail_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); -fifo_state_enum fifo_init (fifo_obj_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size); +fifo_state_enum fifo_init (fifo_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size); #endif diff --git a/Example/E08_eeprom_demo/libraries/zf_common/zf_common_font.c b/Example/E08_eeprom_demo/libraries/zf_common/zf_common_font.c index c816f9d..ee1df09 100644 --- a/Example/E08_eeprom_demo/libraries/zf_common/zf_common_font.c +++ b/Example/E08_eeprom_demo/libraries/zf_common/zf_common_font.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_font * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_common/zf_common_font.h b/Example/E08_eeprom_demo/libraries/zf_common/zf_common_font.h index 24b8602..7531250 100644 --- a/Example/E08_eeprom_demo/libraries/zf_common/zf_common_font.h +++ b/Example/E08_eeprom_demo/libraries/zf_common/zf_common_font.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_font * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_common/zf_common_function.c b/Example/E08_eeprom_demo/libraries/zf_common/zf_common_function.c index d403fb5..acf2739 100644 --- a/Example/E08_eeprom_demo/libraries/zf_common/zf_common_function.c +++ b/Example/E08_eeprom_demo/libraries/zf_common/zf_common_function.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_function * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_common/zf_common_function.h b/Example/E08_eeprom_demo/libraries/zf_common/zf_common_function.h index f5683e1..101b58a 100644 --- a/Example/E08_eeprom_demo/libraries/zf_common/zf_common_function.h +++ b/Example/E08_eeprom_demo/libraries/zf_common/zf_common_function.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_function * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_common/zf_common_headfile.h b/Example/E08_eeprom_demo/libraries/zf_common/zf_common_headfile.h index aa06ef8..86762db 100644 --- a/Example/E08_eeprom_demo/libraries/zf_common/zf_common_headfile.h +++ b/Example/E08_eeprom_demo/libraries/zf_common/zf_common_headfile.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_headfile * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -82,7 +82,7 @@ //===================================================外接设备驱动层=================================================== #include "zf_device_absolute_encoder.h" #include "zf_device_bluetooth_ch9141.h" -#include "zf_device_gps_tau1201.h" +#include "zf_device_gnss.h" #include "zf_device_camera.h" #include "zf_device_dl1a.h" #include "zf_device_dl1b.h" @@ -108,6 +108,7 @@ //====================================================应用组件层==================================================== #include "seekfree_assistant.h" +#include "seekfree_assistant_interface.h" //====================================================应用组件层==================================================== //=====================================================用户层====================================================== diff --git a/Example/E08_eeprom_demo/libraries/zf_common/zf_common_interrupt.c b/Example/E08_eeprom_demo/libraries/zf_common/zf_common_interrupt.c index 61058b2..af12fe0 100644 --- a/Example/E08_eeprom_demo/libraries/zf_common/zf_common_interrupt.c +++ b/Example/E08_eeprom_demo/libraries/zf_common/zf_common_interrupt.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_interrupt * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_common/zf_common_interrupt.h b/Example/E08_eeprom_demo/libraries/zf_common/zf_common_interrupt.h index 99b0e53..f828423 100644 --- a/Example/E08_eeprom_demo/libraries/zf_common/zf_common_interrupt.h +++ b/Example/E08_eeprom_demo/libraries/zf_common/zf_common_interrupt.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_interrupt * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_common/zf_common_typedef.h b/Example/E08_eeprom_demo/libraries/zf_common/zf_common_typedef.h index bd09f30..9a07c92 100644 --- a/Example/E08_eeprom_demo/libraries/zf_common/zf_common_typedef.h +++ b/Example/E08_eeprom_demo/libraries/zf_common/zf_common_typedef.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_typedef * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_components/seekfree_assistant.c b/Example/E08_eeprom_demo/libraries/zf_components/seekfree_assistant.c index a196e10..0b7cb9d 100644 --- a/Example/E08_eeprom_demo/libraries/zf_components/seekfree_assistant.c +++ b/Example/E08_eeprom_demo/libraries/zf_components/seekfree_assistant.c @@ -1,49 +1,71 @@ /********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ -#include "zf_common_fifo.h" + +#include "zf_common_debug.h" + #include "seekfree_assistant.h" -seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 -static seekfree_assistant_camera_struct seekfree_assistant_camera_data; // 图像上位机协议数据 -static seekfree_assistant_camera_dot_struct seekfree_assistant_camera_dot_data; // 图像上位机打点协议数据 -static seekfree_assistant_camera_buffer_struct seekfree_assistant_camera_buffer; // 图像以及边界缓冲区信息 -static fifo_obj_struct seekfree_assistant_fifo; -static uint8 seekfree_assistant_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE]; // 数据存放数组 -float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 保存接收到的参数 -vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 参数更新标志位 +extern uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length); +extern uint32 seekfree_assistant_receive (uint8 *buff, uint32 length); + +#if (1 == SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE) +#include "zf_common_fifo.h" +static uint8 seekfree_assistant_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE]; // FIFO缓冲区 +static fifo_struct seekfree_assistant_fifo = // FIFO结构体 +{ + .buffer = seekfree_assistant_buffer, + .execution = FIFO_IDLE, + .type = FIFO_DATA_8BIT, + .head = 0, + .end = 0, + .size = SEEKFREE_ASSISTANT_BUFFER_SIZE, + .max = SEEKFREE_ASSISTANT_BUFFER_SIZE, +}; +#endif + +static seekfree_assistant_camera_struct seekfree_assistant_camera_data; // 图像上位机协议数据 +static seekfree_assistant_camera_dot_struct seekfree_assistant_camera_dot_data; // 图像上位机打点协议数据 +static seekfree_assistant_camera_buffer_struct seekfree_assistant_camera_buffer; // 图像以及边界缓冲区信息 + +seekfree_assistant_transfer_callback_function seekfree_assistant_transfer_callback = seekfree_assistant_transfer; // 数据发送函数指针 +seekfree_assistant_receive_callback_function seekfree_assistant_receive_callback = seekfree_assistant_receive; // 数据接收函数指针 + +seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 +float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 保存接收到的参数 +vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 参数更新标志位 //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手求和函数 @@ -87,7 +109,7 @@ void seekfree_assistant_camera_data_send (seekfree_assistant_image_type_enum cam seekfree_assistant_camera_data.image_height = height; // 首先发送帧头、功能、摄像头类型、以及宽度高度等信息 - seekfree_assistant_transfer((const uint8 *)&seekfree_assistant_camera_data, sizeof(seekfree_assistant_camera_struct)); + seekfree_assistant_transfer_callback((const uint8 *)&seekfree_assistant_camera_data, sizeof(seekfree_assistant_camera_struct)); // 根据摄像头类型计算图像大小 switch(camera_type) @@ -111,9 +133,8 @@ void seekfree_assistant_camera_data_send (seekfree_assistant_image_type_enum cam // 发送图像数据 if(NULL != image_addr) { - seekfree_assistant_transfer(image_addr, image_size); + seekfree_assistant_transfer_callback(image_addr, image_size); } - } //------------------------------------------------------------------------------------------------------------------- @@ -139,16 +160,15 @@ void seekfree_assistant_camera_dot_send (seekfree_assistant_camera_buffer_struct dot_bytes *= 2; } - // 首先发送帧头、功能、边界编号、坐标长度、点个数 - seekfree_assistant_transfer((const uint8 *)&seekfree_assistant_camera_dot_data, sizeof(seekfree_assistant_camera_dot_struct)); + seekfree_assistant_transfer_callback((const uint8 *)&seekfree_assistant_camera_dot_data, sizeof(seekfree_assistant_camera_dot_struct)); for(i=0; i < SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY; i++) { // 判断是否发送横坐标数据 if(NULL != buffer->boundary_x[i]) { - seekfree_assistant_transfer((const uint8 *)buffer->boundary_x[i], dot_bytes); + seekfree_assistant_transfer_callback((const uint8 *)buffer->boundary_x[i], dot_bytes); } // 判断是否发送纵坐标数据 @@ -156,10 +176,9 @@ void seekfree_assistant_camera_dot_send (seekfree_assistant_camera_buffer_struct { // 如果没有纵坐标数据,则表示每一行只有一个边界 // 指定了横纵坐标数据,这种方式可以实现同一行多个边界的情况,例如搜线算法能够搜索出回弯。 - seekfree_assistant_transfer((const uint8 *)buffer->boundary_y[i], dot_bytes); + seekfree_assistant_transfer_callback((const uint8 *)buffer->boundary_y[i], dot_bytes); } } - } //------------------------------------------------------------------------------------------------------------------- @@ -193,7 +212,7 @@ void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struc // 数据在调用本函数之前,由用户将需要发送的数据写入seekfree_assistant_oscilloscope_data.data[] - seekfree_assistant_transfer((const uint8 *)seekfree_assistant_oscilloscope, packet_size); + seekfree_assistant_transfer_callback((const uint8 *)seekfree_assistant_oscilloscope, packet_size); } //------------------------------------------------------------------------------------------------------------------- @@ -364,12 +383,14 @@ void seekfree_assistant_camera_send (void) } } + //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手解析接收到的数据 // 参数说明 void // 返回参数 void // 使用示例 函数只需要放到周期运行的PIT中断或者主循环即可 //------------------------------------------------------------------------------------------------------------------- +#if (1 == SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE) void seekfree_assistant_data_analysis (void) { uint8 temp_sum; @@ -380,14 +401,13 @@ void seekfree_assistant_data_analysis (void) uint32 temp_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE / 4]; // 尝试读取数据, 如果不是自定义的传输方式则从接收回调中读取数据 - read_length = seekfree_assistant_receive((uint8 *)temp_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); + read_length = seekfree_assistant_receive_callback((uint8 *)temp_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); if(read_length) { // 将读取到的数据写入FIFO fifo_write_buffer(&seekfree_assistant_fifo, (uint8 *)temp_buffer, read_length); } - while(sizeof(seekfree_assistant_parameter_struct) <= fifo_used(&seekfree_assistant_fifo)) { read_length = sizeof(seekfree_assistant_parameter_struct); @@ -416,21 +436,11 @@ void seekfree_assistant_data_analysis (void) } } - // 丢弃无需使用的数据 fifo_read_buffer(&seekfree_assistant_fifo, (uint8 *)temp_buffer, &read_length, FIFO_READ_AND_CLEAN); } } - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 逐飞助手 初始化 -// 参数说明 -// 返回参数 void -// 使用示例 -//------------------------------------------------------------------------------------------------------------------- -ZF_WEAK void seekfree_assistant_init () -{ - fifo_init(&seekfree_assistant_fifo, FIFO_DATA_8BIT, seekfree_assistant_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); -} +#endif + diff --git a/Example/E08_eeprom_demo/libraries/zf_components/seekfree_assistant.h b/Example/E08_eeprom_demo/libraries/zf_components/seekfree_assistant.h index d02abb1..ae0f67c 100644 --- a/Example/E08_eeprom_demo/libraries/zf_components/seekfree_assistant.h +++ b/Example/E08_eeprom_demo/libraries/zf_components/seekfree_assistant.h @@ -1,69 +1,75 @@ -/*/********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +/********************************************************************************************************************* +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ #ifndef _seekfree_assistant_h_ #define _seekfree_assistant_h_ #include "zf_common_typedef.h" -#include "zf_common_debug.h" + + +// 1:使能参数调节的功能 0:关闭参数调节的功能 +#define SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE ( 1 ) + + // 定义接收FIFO大小 -#define SEEKFREE_ASSISTANT_BUFFER_SIZE ( 0x80 ) +#define SEEKFREE_ASSISTANT_BUFFER_SIZE ( 0x80 ) + +// 定义示波器的最大通道数量 +#define SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT ( 0x08 ) + +// 定义参数调试的最大通道数量 +#define SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT ( 0x08 ) + +// 定义图像边线最大数量 +#define SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY ( 0x08 ) + +// 单片机往上位机发送的帧头 +#define SEEKFREE_ASSISTANT_SEND_HEAD ( 0xAA ) + +// 摄像头类 +#define SEEKFREE_ASSISTANT_CAMERA_FUNCTION ( 0x02 ) +#define SEEKFREE_ASSISTANT_CAMERA_DOT_FUNCTION ( 0x03 ) +#define SEEKFREE_ASSISTANT_CAMERA_OSCILLOSCOPE ( 0x10 ) + +// 上位机往单片机发送的帧头 +#define SEEKFREE_ASSISTANT_RECEIVE_HEAD ( 0x55 ) + +// 参数设置类 +#define SEEKFREE_ASSISTANT_RECEIVE_SET_PARAMETER ( 0x20 ) -// 定义示波器的最大通道数量 -#define SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT ( 0x08 ) - -// 定义参数调试的最大通道数量 -#define SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT ( 0x08 ) - -// 定义图像边线最大数量 -#define SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY ( 0x08 ) - -// 单片机往上位机发送的帧头 -#define SEEKFREE_ASSISTANT_SEND_HEAD ( 0xAA ) - -// 摄像头类 -#define SEEKFREE_ASSISTANT_CAMERA_FUNCTION ( 0x02 ) -#define SEEKFREE_ASSISTANT_CAMERA_DOT_FUNCTION ( 0x03 ) -#define SEEKFREE_ASSISTANT_CAMERA_OSCILLOSCOPE ( 0x10 ) - -// 上位机往单片机发送的帧头 -#define SEEKFREE_ASSISTANT_RECEIVE_HEAD ( 0x55 ) - -// 参数设置类 -#define SEEKFREE_ASSISTANT_RECEIVE_SET_PARAMETER ( 0x20 ) // 摄像头类型枚举 typedef enum @@ -91,71 +97,69 @@ typedef enum typedef struct { - uint8 head; // 帧头 - uint8 channel_num; // 高四位为功能字 低四位为通道数量 - uint8 check_sum; // 和校验 - uint8 length; // 包长度 - float data[SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT]; // 通道数据 + uint8 head; // 帧头 + uint8 channel_num; // 高四位为功能字 低四位为通道数量 + uint8 check_sum; // 和校验 + uint8 length; // 包长度 + float data[SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT]; // 通道数据 }seekfree_assistant_oscilloscope_struct; typedef struct { - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 camera_type; // 低四位表示边界数量 第四位表示是否有图像数据 例如0x13:其中3表示一副图像有三条边界(通常是左边界、中线、右边界)、1表示没有图像数据 - uint8 length; // 包长度(仅包含协议部分) - uint16 image_width; // 图像宽度 - uint16 image_height; // 图像高度 -}seekfree_assistant_camera_struct; - - -typedef struct -{ - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 dot_type; // 点类型 BIT5:1:坐标是16位的 0:坐标是8位的 BIT7-BIT6:0:只有X坐标 1:只有Y坐标 2:X和Y坐标都有 BIT3-BIT0:边界数量 - uint8 length; // 包长度(仅包含协议部分) - uint16 dot_num; // 画点数量 - uint8 valid_flag; // 通道标识 - uint8 reserve; // 保留 -}seekfree_assistant_camera_dot_struct; - -typedef struct -{ - void *image_addr; // 摄像头地址 - uint16 width; // 图像宽度 - uint16 height; // 图像高度 - seekfree_assistant_image_type_enum camera_type; // 摄像头类型 - void *boundary_x[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界横坐标数组地址 - void *boundary_y[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界纵坐标数组地址 + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 camera_type; // 低四位表示边界数量 第四位表示是否有图像数据 例如0x13:其中3表示一副图像有三条边界(通常是左边界、中线、右边界)、1表示没有图像数据 + uint8 length; // 包长度(仅包含协议部分) + uint16 image_width; // 图像宽度 + uint16 image_height; // 图像高度 +}seekfree_assistant_camera_struct; + + +typedef struct +{ + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 dot_type; // 点类型 BIT5:1:坐标是16位的 0:坐标是8位的 BIT7-BIT6:0:只有X坐标 1:只有Y坐标 2:X和Y坐标都有 BIT3-BIT0:边界数量 + uint8 length; // 包长度(仅包含协议部分) + uint16 dot_num; // 画点数量 + uint8 valid_flag; // 通道标识 + uint8 reserve; // 保留 +}seekfree_assistant_camera_dot_struct; + +typedef struct +{ + void *image_addr; // 摄像头地址 + uint16 width; // 图像宽度 + uint16 height; // 图像高度 + seekfree_assistant_image_type_enum camera_type; // 摄像头类型 + void *boundary_x[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界横坐标数组地址 + void *boundary_y[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界纵坐标数组地址 }seekfree_assistant_camera_buffer_struct; typedef struct { - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 channel; // 通道 - uint8 check_sum; // 和校验 - float data; // 数据 + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 channel; // 通道 + uint8 check_sum; // 和校验 + float data; // 数据 }seekfree_assistant_parameter_struct; +typedef uint32 (*seekfree_assistant_transfer_callback_function) (const uint8 *buff, uint32 length); +typedef uint32 (*seekfree_assistant_receive_callback_function) (uint8 *buff, uint32 length); -extern seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 -extern float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 保存接收到的参数 -extern vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 参数更新标志位 +extern seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 +extern float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 保存接收到的参数 +extern vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 参数更新标志位 + + +void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struct *seekfree_assistant_oscilloscope); +void seekfree_assistant_camera_information_config (seekfree_assistant_image_type_enum camera_type, void *image_addr, uint16 width, uint16 height); +void seekfree_assistant_camera_boundary_config (seekfree_assistant_boundary_type_enum boundary_type, uint16 dot_num, void *dot_x1, void *dot_x2, void *dot_x3, void *dot_y1, void *dot_y2, void *dot_y3); +void seekfree_assistant_camera_send (void); +void seekfree_assistant_data_analysis (void); -uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length); -uint32 seekfree_assistant_receive (uint8 *buff, uint32 length); - -void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struct *seekfree_assistant_oscilloscope); - -void seekfree_assistant_camera_information_config (seekfree_assistant_image_type_enum camera_type, void *image_addr, uint16 width, uint16 height); -void seekfree_assistant_camera_boundary_config (seekfree_assistant_boundary_type_enum boundary_type, uint16 dot_num, void *dot_x1, void *dot_x2, void *dot_x3, void *dot_y1, void *dot_y2, void *dot_y3); -void seekfree_assistant_camera_send (void); - -void seekfree_assistant_data_analysis (void); -void seekfree_assistant_init (void); #endif diff --git a/Example/E08_eeprom_demo/libraries/zf_components/seekfree_assistant_interface.c b/Example/E08_eeprom_demo/libraries/zf_components/seekfree_assistant_interface.c index 99dbeef..fdade63 100644 --- a/Example/E08_eeprom_demo/libraries/zf_components/seekfree_assistant_interface.c +++ b/Example/E08_eeprom_demo/libraries/zf_components/seekfree_assistant_interface.c @@ -1,42 +1,55 @@ /********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant_interface * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ #include "zf_common_typedef.h" +#include "zf_common_fifo.h" #include "zf_common_debug.h" +#include "zf_driver_uart.h" +#include "zf_device_wireless_uart.h" +#include "zf_device_bluetooth_ch9141.h" +#include "zf_device_wifi_uart.h" +#include "zf_device_wifi_spi.h" #include "seekfree_assistant.h" +#include "seekfree_assistant_interface.h" + + +extern seekfree_assistant_transfer_callback_function seekfree_assistant_transfer_callback; // 数据发送函数指针 +extern seekfree_assistant_receive_callback_function seekfree_assistant_receive_callback; // 数据接收函数指针 + + //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手发送函数 // 参数说明 *buff 需要发送的数据地址 @@ -46,11 +59,9 @@ //------------------------------------------------------------------------------------------------------------------- ZF_WEAK uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length) { - uint32 len = 0; - - len = debug_send_buffer(buff, length); - - return len; + + // 当选择自定义通讯方式时 需要自行完成数据发送功能 + return length; } //------------------------------------------------------------------------------------------------------------------- @@ -62,11 +73,57 @@ ZF_WEAK uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length) //------------------------------------------------------------------------------------------------------------------- ZF_WEAK uint32 seekfree_assistant_receive (uint8 *buff, uint32 length) { - uint32 len = 0; + // 当选择自定义通讯方式时 需要自行完成数据接收功能 + return 0; +} - len = debug_read_ring_buffer(buff, length); - - return len; +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 逐飞助手接口 初始化 +// 参数说明 +// 返回参数 void +// 使用示例 seekfree_assistant_interface_init(SEEKFREE_ASSISTANT_WIFI_SPI); 使用高速WIFI SPI模块进行数据收发 +// 备注 需要自行调用设备的初始化,例如使用无线转串口进行数据的收发,则需要自行调用无线转串口的初始化,然后再调用seekfree_assistant_interface_init完成逐飞助手的接口初始化 +//------------------------------------------------------------------------------------------------------------------- +ZF_WEAK void seekfree_assistant_interface_init (seekfree_assistant_transfer_device_enum transfer_device) +{ + switch(transfer_device) + { + case SEEKFREE_ASSISTANT_DEBUG_UART: + { + seekfree_assistant_transfer_callback = debug_send_buffer; + seekfree_assistant_receive_callback = debug_read_ring_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIRELESS_UART: + { + seekfree_assistant_transfer_callback = wireless_uart_send_buffer; + seekfree_assistant_receive_callback = wireless_uart_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_CH9141: + { + seekfree_assistant_transfer_callback = bluetooth_ch9141_send_buffer; + seekfree_assistant_receive_callback = bluetooth_ch9141_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIFI_UART: + { + seekfree_assistant_transfer_callback = wifi_uart_send_buffer; + seekfree_assistant_receive_callback = wifi_uart_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIFI_SPI: + { + seekfree_assistant_transfer_callback = wifi_spi_send_buffer; + seekfree_assistant_receive_callback = wifi_spi_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_CUSTOM: + { + // 根据自己的需求 自行实现seekfree_assistant_transfer与seekfree_assistant_receive函数,完成数据的收发 + + }break; + } } diff --git a/Example/E08_eeprom_demo/libraries/zf_components/seekfree_assistant_interface.h b/Example/E08_eeprom_demo/libraries/zf_components/seekfree_assistant_interface.h new file mode 100644 index 0000000..940b5f7 --- /dev/null +++ b/Example/E08_eeprom_demo/libraries/zf_components/seekfree_assistant_interface.h @@ -0,0 +1,57 @@ +/********************************************************************************************************************* +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 +* Copyright (c) 2022 SEEKFREE 逐飞科技 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 +* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 +* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 +* +* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 +* 甚至没有隐含的适销性或适合特定用途的保证 +* 更多细节请参见 GPL +* +* 您应该在收到本开源库的同时收到一份 GPL 的副本 +* 如果没有,请参阅 +* +* 额外注明: +* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 +* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 +* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 +* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) +* +* 文件名称 seekfree_assistant_interface +* 公司名称 成都逐飞科技有限公司 +* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A +* 店铺链接 https://seekfree.taobao.com/ +* +* 修改记录 +* 日期 作者 备注 +* 2024-1-11 SeekFree first version +********************************************************************************************************************/ + +#ifndef _seekfree_assistant_interface_h_ +#define _seekfree_assistant_interface_h_ + + + +// 数据发送设备枚举 +typedef enum +{ + SEEKFREE_ASSISTANT_DEBUG_UART, // 调试串口 使用的串口由DEBUG_UART_INDEX宏定义指定 + SEEKFREE_ASSISTANT_WIRELESS_UART, // 无线转串口 + SEEKFREE_ASSISTANT_CH9141, // CH9141蓝牙 + SEEKFREE_ASSISTANT_WIFI_UART, // WIFI转串口 + SEEKFREE_ASSISTANT_WIFI_SPI, // 高速WIFI SPI + SEEKFREE_ASSISTANT_CUSTOM, // 自定义通讯方式 需要自行seekfree_assistant_transfer与seekfree_assistant_receive函数 +}seekfree_assistant_transfer_device_enum; + + +void seekfree_assistant_interface_init (seekfree_assistant_transfer_device_enum transfer_device); + + + +#endif diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_absolute_encoder.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_absolute_encoder.c index 7c80a3b..f9bc809 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_absolute_encoder.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_absolute_encoder.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_absolute_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_absolute_encoder.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_absolute_encoder.h index e6cc057..ed92906 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_absolute_encoder.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_absolute_encoder.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_absolute_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c index 500bccb..b0a06df 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_bluetooth_ch9141 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -54,7 +54,7 @@ #include "zf_device_camera.h" #include "zf_device_bluetooth_ch9141.h" -static fifo_obj_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 +static fifo_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 static uint8 bluetooth_ch9141_buffer[BLUETOOTH_CH9141_BUFFER_SIZE]; // 数据存放数组 static uint8 bluetooth_ch9141_data = 0; // 数据临时存放变量 diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h index 800be6c..ffb30b5 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h @@ -24,7 +24,7 @@ * 文件名称 main * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_camera.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_camera.c index 84c7aa0..68668c4 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_camera.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_camera.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_camera * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -45,7 +45,7 @@ #include "zf_device_camera.h" -fifo_obj_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 +fifo_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; // 定义摄像头接收数据缓冲区 uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // 定义摄像头数据发送到上位机的帧头 diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_camera.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_camera.h index 58efb06..2cd7d2d 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_camera.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_camera.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_camera * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -44,7 +44,7 @@ //=================================================摄像头公共库 基本配置================================================ #define CAMERA_RECEIVER_BUFFER_SIZE (8) // 定义摄像头接收数据缓冲区大小 -extern fifo_obj_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 +extern fifo_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 extern uint8 camera_send_image_frame_header[4]; // 声明摄像头数据发送到上位机的帧头 //=================================================摄像头公共库 基本配置================================================ diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_config.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_config.h index af6a3d8..6c8147d 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_config.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_config.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_config * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_dl1a.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_dl1a.c index 3e7410c..27be3a7 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_dl1a.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_dl1a.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1a * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_dl1a.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_dl1a.h index 89145d3..3176dd3 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_dl1a.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_dl1a.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1a * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_dl1b.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_dl1b.c index 90e64b3..96e472e 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_dl1b.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_dl1b.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1b * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_dl1b.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_dl1b.h index b144739..922b3ce 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_dl1b.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_dl1b.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1b * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_gnss.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_gnss.c new file mode 100644 index 0000000..caf7cd0 --- /dev/null +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_gnss.c @@ -0,0 +1,620 @@ +/********************************************************************************************************************* +* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* Copyright (c) 2022 SEEKFREE 逐飞科技 +* +* 本文件是 TC264 开源库的一部分 +* +* TC264 开源库 是免费软件 +* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 +* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 +* +* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 +* 甚至没有隐含的适销性或适合特定用途的保证 +* 更多细节请参见 GPL +* +* 您应该在收到本开源库的同时收到一份 GPL 的副本 +* 如果没有,请参阅 +* +* 额外注明: +* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 +* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 +* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 +* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) +* +* 文件名称 zf_device_gnss +* 公司名称 成都逐飞科技有限公司 +* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 +* 开发环境 ADS v1.9.20 +* 适用平台 TC264D +* 店铺链接 https://seekfree.taobao.com/ +* +* 修改记录 +* 日期 作者 备注 +* 2023-12-28 pudding first version +********************************************************************************************************************/ +/********************************************************************************************************************* +* 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* RX 查看 zf_device_gnss.h 中 GNSS_RX 宏定义 +* TX 查看 zf_device_gnss.h 中 GNSS_TX 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* ------------------------------------ +********************************************************************************************************************/ + +#include "math.h" +#include "zf_common_function.h" +#include "zf_common_fifo.h" +#include "zf_driver_delay.h" +#include "zf_driver_uart.h" + +#include "zf_device_gnss.h" + +#define GNSS_BUFFER_SIZE ( 128 ) + +uint8 gnss_flag = 0; // 1:采集完成等待处理数据 0:没有采集完成 +gnss_info_struct gnss; // GPS解析之后的数据 + +static uint8 gnss_state = 0; // 1:GPS初始化完成 +static fifo_struct gnss_receiver_fifo; // +static uint8 gnss_receiver_buffer[GNSS_BUFFER_SIZE]; // 数据存放数组 + +static gps_state_enum gnss_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 +static gps_state_enum gnss_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 +static gps_state_enum gnss_ths_state = GPS_STATE_RECEIVING; // rmc 语句状态 + +static uint8 gps_gga_buffer[GNSS_BUFFER_SIZE]; +static uint8 gps_rmc_buffer[GNSS_BUFFER_SIZE]; +static uint8 gps_ths_buffer[GNSS_BUFFER_SIZE]; + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 获取指定 ',' 后面的索引 +// 参数说明 num 第几个逗号 +// 参数说明 *str 字符串 +// 返回参数 uint8 返回索引 +// 使用示例 get_parameter_index(1, s); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 get_parameter_index (uint8 num, char *str) +{ + uint8 i = 0, j = 0; + char *temp = strchr(str, '\n'); + uint8 len = 0, len1 = 0; + + 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; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 给定字符串第一个 ',' 之前的数据转换为int +// 参数说明 *s 字符串 +// 返回参数 float 返回数值 +// 使用示例 get_int_number(&buf[get_parameter_index(7, buf)]); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static int get_int_number (char *s) +{ + char buf[10]; + uint8 i = 0; + int return_value = 0; + i = get_parameter_index(1, s); + i = i - 1; + strncpy(buf, s, i); + buf[i] = 0; + return_value = func_str_to_int(buf); + return return_value; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 给定字符串第一个 ',' 之前的数据转换为float +// 参数说明 *s 字符串 +// 返回参数 float 返回数值 +// 使用示例 get_float_number(&buf[get_parameter_index(8, buf)]); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static float get_float_number (char *s) +{ + uint8 i = 0; + char buf[15]; + float return_value = 0; + + i = get_parameter_index(1, s); + i = i - 1; + strncpy(buf, s, i); + buf[i] = 0; + return_value = (float)func_str_to_double(buf); + return return_value; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 给定字符串第一个 ',' 之前的数据转换为double +// 参数说明 *s 字符串 +// 返回参数 double 返回数值 +// 使用示例 get_double_number(&buf[get_parameter_index(3, buf)]); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static double get_double_number (char *s) +{ + uint8 i = 0; + char buf[15]; + double return_value = 0; + + i = get_parameter_index(1, s); + i = i - 1; + strncpy(buf, s, i); + buf[i] = 0; + return_value = func_str_to_double(buf); + return return_value; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 世界时间转换为北京时间 +// 参数说明 *time 保存的时间 +// 返回参数 void +// 使用示例 utc_to_btc(&gnss->time); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static void utc_to_btc (gps_time_struct *time) +{ + uint8 day_num = 0; + + time->hour = time->hour + 8; + if(23 < time->hour) + { + time->hour -= 24; + time->day += 1; + + if(2 == time->month) + { + day_num = 28; + if((0 == time->year % 4 && 0 != time->year % 100) || 0 == time->year % 400) // 判断是否为闰年 + { + day_num ++; // 闰月 2月为29天 + } + } + else + { + day_num = 31; // 1 3 5 7 8 10 12这些月份为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(12 < time->month) + { + time->month -= 12; + time->year ++; + } + } + } +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 RMC语句解析 +// 参数说明 *line 接收到的语句信息 +// 参数说明 *gnss 保存解析后的数据 +// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 +// 使用示例 gps_gnrmc_parse((char *)data_buffer, &gnss); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 gps_gnrmc_parse (char *line, gnss_info_struct *gnss) +{ + uint8 state = 0, temp = 0; + + double latitude = 0; // 纬度 + double longitude = 0; // 经度 + + double lati_cent_tmp = 0, lati_second_tmp = 0; + double long_cent_tmp = 0, long_second_tmp = 0; + float speed_tmp = 0; + char *buf = line; + uint8 return_state = 0; + + state = buf[get_parameter_index(2, buf)]; + + if('A' == state) // 如果数据有效 则解析数据 + { + return_state = 1; + gnss->state = 1; + gnss -> ns = buf[get_parameter_index(4, buf)]; + gnss -> 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)]); + + gnss->latitude_degree = (int)latitude / 100; // 纬度转换为度分秒 + lati_cent_tmp = (latitude - gnss->latitude_degree * 100); + gnss->latitude_cent = (int)lati_cent_tmp; + lati_second_tmp = (lati_cent_tmp - gnss->latitude_cent) * 6000; + gnss->latitude_second = (int)lati_second_tmp; + + gnss->longitude_degree = (int)longitude / 100; // 经度转换为度分秒 + long_cent_tmp = (longitude - gnss->longitude_degree * 100); + gnss->longitude_cent = (int)long_cent_tmp; + long_second_tmp = (long_cent_tmp - gnss->longitude_cent) * 6000; + gnss->longitude_second = (int)long_second_tmp; + + gnss->latitude = gnss->latitude_degree + lati_cent_tmp / 60; + gnss->longitude = gnss->longitude_degree + long_cent_tmp / 60; + + speed_tmp = get_float_number(&buf[get_parameter_index(7, buf)]); // 速度(海里/小时) + gnss->speed = speed_tmp * 1.85f; // 转换为公里/小时 + gnss->direction = get_float_number(&buf[get_parameter_index(8, buf)]); // 角度 + } + else + { + gnss->state = 0; + } + + // 在定位没有生效前也是有时间数据的,可以直接解析 + gnss->time.hour = (buf[7] - '0') * 10 + (buf[8] - '0'); // 时间 + gnss->time.minute = (buf[9] - '0') * 10 + (buf[10] - '0'); + gnss->time.second = (buf[11] - '0') * 10 + (buf[12] - '0'); + temp = get_parameter_index(9, buf); + gnss->time.day = (buf[temp + 0] - '0') * 10 + (buf[temp + 1] - '0'); // 日期 + gnss->time.month = (buf[temp + 2] - '0') * 10 + (buf[temp + 3] - '0'); + gnss->time.year = (buf[temp + 4] - '0') * 10 + (buf[temp + 5] - '0') + 2000; + + utc_to_btc(&gnss->time); + + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 GGA语句解析 +// 参数说明 *line 接收到的语句信息 +// 参数说明 *gnss 保存解析后的数据 +// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 +// 使用示例 gps_gngga_parse((char *)data_buffer, &gnss); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 gps_gngga_parse (char *line, gnss_info_struct *gnss) +{ + uint8 state = 0; + char *buf = line; + uint8 return_state = 0; + + state = buf[get_parameter_index(2, buf)]; + + if(',' != state) + { + gnss->satellite_used = (uint8)get_int_number(&buf[get_parameter_index(7, buf)]); + gnss->height = get_float_number(&buf[get_parameter_index(9, buf)]) + get_float_number(&buf[get_parameter_index(11, buf)]); // 高度 = 海拔高度 + 地球椭球面相对大地水准面的高度 + return_state = 1; + } + + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 THS语句解析 +// 参数说明 *line 接收到的语句信息 +// 参数说明 *gnss 保存解析后的数据 +// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 +// 使用示例 gps_gnths_parse((char *)data_buffer, &gnss); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 gps_gnths_parse (char *line, gnss_info_struct *gnss) +{ + uint8 state = 0; + char *buf = line; + uint8 return_state = 0; + + state = buf[get_parameter_index(2, buf)]; + + if('A' == state) + { + gnss->antenna_direction_state = 1; + gnss->antenna_direction = get_float_number(&buf[get_parameter_index(1, buf)]); + return_state = 1; + } + else + { + gnss->antenna_direction_state = 0; + } + + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 计算从第一个点到第二个点的距离 +// 参数说明 latitude1 第一个点的纬度 +// 参数说明 longitude1 第一个点的经度 +// 参数说明 latitude2 第二个点的纬度 +// 参数说明 longitude2 第二个点的经度 +// 返回参数 double 返回两点距离 +// 使用示例 get_two_points_distance(latitude1_1, longitude1, latitude2, longitude2); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +double get_two_points_distance (double latitude1, double longitude1, double latitude2, double longitude2) +{ + const double EARTH_RADIUS = 6378137; // 地球半径(单位:m) + double rad_latitude1 = 0; + double rad_latitude2 = 0; + double rad_longitude1 = 0; + double rad_longitude2 = 0; + double distance = 0; + double a = 0; + double b = 0; + + rad_latitude1 = ANGLE_TO_RAD(latitude1); // 根据角度计算弧度 + 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 里面实现的算法 + distance = distance * EARTH_RADIUS; + + return distance; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 计算从第一个点到第二个点的方位角 +// 参数说明 latitude1 第一个点的纬度 +// 参数说明 longitude1 第一个点的经度 +// 参数说明 latitude2 第二个点的纬度 +// 参数说明 longitude2 第二个点的经度 +// 返回参数 double 返回方位角(0至360) +// 使用示例 get_two_points_azimuth(latitude1_1, longitude1, latitude2, longitude2); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +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 ((0 < angle) ? angle : (angle + 360)); +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 解析GPS数据 +// 参数说明 void +// 返回参数 uint8 0-解析成功 1-解析失败 可能数据包错误 +// 使用示例 gps_data_parse(); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +uint8 gnss_data_parse (void) +{ + uint8 return_state = 0; + uint8 check_buffer[5] = {'0', 'x', 0x00, 0x00, 0x00}; + uint8 bbc_xor_origin = 0; + uint8 bbc_xor_calculation = 0; + uint32 data_len = 0; + + do + { + if(GPS_STATE_RECEIVED == gnss_rmc_state) + { + gnss_rmc_state = GPS_STATE_PARSING; + strncpy((char *)&check_buffer[2], strchr((const char *)gps_rmc_buffer, '*') + 1, 2); + bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); + for(bbc_xor_calculation = gps_rmc_buffer[1], data_len = 2; '*' != gps_rmc_buffer[data_len]; data_len ++) + { + bbc_xor_calculation ^= gps_rmc_buffer[data_len]; + } + if(bbc_xor_calculation != bbc_xor_origin) + { + // 数据校验失败 + return_state = 1; + break; + } + + gps_gnrmc_parse((char *)gps_rmc_buffer, &gnss); + } + gnss_rmc_state = GPS_STATE_RECEIVING; + + if(GPS_STATE_RECEIVED == gnss_gga_state) + { + gnss_gga_state = GPS_STATE_PARSING; + strncpy((char *)&check_buffer[2], strchr((const char *)gps_gga_buffer, '*') + 1, 2); + bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); + + for(bbc_xor_calculation = gps_gga_buffer[1], data_len = 2; '*' != gps_gga_buffer[data_len]; data_len ++) + { + bbc_xor_calculation ^= gps_gga_buffer[data_len]; + } + if(bbc_xor_calculation != bbc_xor_origin) + { + // 数据校验失败 + return_state = 1; + break; + } + + gps_gngga_parse((char *)gps_gga_buffer, &gnss); + } + gnss_gga_state = GPS_STATE_RECEIVING; + + if(GPS_STATE_RECEIVED == gnss_ths_state) + { + gnss_ths_state = GPS_STATE_PARSING; + strncpy((char *)&check_buffer[2], strchr((const char *)gps_ths_buffer, '*') + 1, 2); + bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); + + for(bbc_xor_calculation = gps_ths_buffer[1], data_len = 2; '*' != gps_ths_buffer[data_len]; data_len ++) + { + bbc_xor_calculation ^= gps_ths_buffer[data_len]; + } + if(bbc_xor_calculation != bbc_xor_origin) + { + // 数据校验失败 + return_state = 1; + break; + } + + gps_gnths_parse((char *)gps_ths_buffer, &gnss); + } + gnss_ths_state = GPS_STATE_RECEIVING; + + }while(0); + return return_state; +} + + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 GPS串口回调函数 +// 参数说明 void +// 返回参数 void +// 使用示例 gps_uart_callback(); +// 备注信息 此函数需要在串口接收中断内进行调用 +//------------------------------------------------------------------------------------------------------------------- +void gnss_uart_callback (void) +{ + uint8 temp_gps[6]; + uint32 temp_length = 0; + + + + + if(gnss_state) + { + uint8 dat; + while(uart_query_byte(GNSS_UART, &dat)) + { + fifo_write_buffer(&gnss_receiver_fifo, &dat, 1); + } + + if('\n' == dat) + { + // 读取前6个数据 用于判断语句类型 + temp_length = 6; + fifo_read_buffer(&gnss_receiver_fifo, temp_gps, &temp_length, FIFO_READ_ONLY); + + // 根据不同类型将数据拷贝到不同的缓冲区 + if(0 == strncmp((char *)&temp_gps[3], "RMC", 3)) + { + // 如果没有在解析数据则更新缓冲区的数据 + if(GPS_STATE_PARSING != gnss_rmc_state) + { + gnss_rmc_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_rmc_buffer, &temp_length, FIFO_READ_AND_CLEAN); + } + } + else if(0 == strncmp((char *)&temp_gps[3], "GGA", 3)) + { + // 如果没有在解析数据则更新缓冲区的数据 + if(GPS_STATE_PARSING != gnss_gga_state) + { + gnss_gga_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_gga_buffer, &temp_length, FIFO_READ_AND_CLEAN); + } + } + else if(0 == strncmp((char *)&temp_gps[3], "THS", 3)) + { + // 如果没有在解析数据则更新缓冲区的数据 + if(GPS_STATE_PARSING != gnss_ths_state) + { + gnss_ths_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_ths_buffer, &temp_length, FIFO_READ_AND_CLEAN); + } + } + + // 统一将FIFO清空 + fifo_clear(&gnss_receiver_fifo); + + gnss_flag = 1; + } + } +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 GPS初始化 +// 参数说明 void +// 返回参数 void +// 使用示例 gps_init(); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +void gnss_init (gps_device_enum gps_device) +{ + 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}; + + if((TAU1201 == gps_device) || (GN42A == gps_device)) + { + fifo_init(&gnss_receiver_fifo, FIFO_DATA_8BIT, gnss_receiver_buffer, GNSS_BUFFER_SIZE); + system_delay_ms(500); // 等待GPS启动后开始初始化 + uart_init(GNSS_UART, 115200, GNSS_RX, GNSS_TX); + + uart_write_buffer(GNSS_UART, (uint8 *)set_rate, sizeof(set_rate)); // 设置GPS更新速率为10hz 如果不调用此语句则默认为1hz + system_delay_ms(200); + + uart_write_buffer(GNSS_UART, (uint8 *)open_rmc, sizeof(open_rmc)); // 开启rmc语句 + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)open_gga, sizeof(open_gga)); // 开启gga语句 + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gll, sizeof(close_gll)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gsa, sizeof(close_gsa)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_grs, sizeof(close_grs)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gsv, sizeof(close_gsv)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_vtg, sizeof(close_vtg)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_zda, sizeof(close_zda)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gst, sizeof(close_gst)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_txt, sizeof(close_txt)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_txt_ant, sizeof(close_txt_ant)); + system_delay_ms(50); + + gnss_state = 1; + uart_rx_interrupt(GNSS_UART, 1); + } + else if(GN43RFA == gps_device) + { + // GN43RFA RTK模块不需要进行参数设置,如果需要修改参数应该使用专用的上位机修改参数 + fifo_init(&gnss_receiver_fifo, FIFO_DATA_8BIT, gnss_receiver_buffer, GNSS_BUFFER_SIZE); + uart_init(GNSS_UART, 115200, GNSS_RX, GNSS_TX); + gnss_state = 1; + uart_rx_interrupt(GNSS_UART, 1); + } + +} diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_gnss.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_gnss.h new file mode 100644 index 0000000..5d58976 --- /dev/null +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_gnss.h @@ -0,0 +1,125 @@ +/********************************************************************************************************************* +* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* Copyright (c) 2022 SEEKFREE 逐飞科技 +* +* 本文件是 TC264 开源库的一部分 +* +* TC264 开源库 是免费软件 +* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 +* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 +* +* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 +* 甚至没有隐含的适销性或适合特定用途的保证 +* 更多细节请参见 GPL +* +* 您应该在收到本开源库的同时收到一份 GPL 的副本 +* 如果没有,请参阅 +* +* 额外注明: +* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 +* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 +* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 +* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) +* +* 文件名称 zf_device_gnss +* 公司名称 成都逐飞科技有限公司 +* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 +* 开发环境 ADS v1.9.20 +* 适用平台 TC264D +* 店铺链接 https://seekfree.taobao.com/ +* +* 修改记录 +* 日期 作者 备注 +* 2023-12-28 pudding first version +********************************************************************************************************************/ +/********************************************************************************************************************* +* 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* RX 查看 zf_device_gnss.h 中 GNSS_RX 宏定义 +* TX 查看 zf_device_gnss.h 中 GNSS_TX 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* ------------------------------------ +********************************************************************************************************************/ + +#ifndef _zf_device_gnss_h_ +#define _zf_device_gnss_h_ + +#include "zf_common_typedef.h" + +//-------------------------------------------------------------------------------------------------- +//引脚配置 +//-------------------------------------------------------------------------------------------------- +#define GNSS_UART (UART_3) +#define GNSS_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 +#define GNSS_TX (UART3_RX_P15_7) // GPS TX串口引脚 + +#define ANGLE_TO_RAD(x) ( (x) * PI / 180.0 ) // 角度转换为弧度 +#define RAD_TO_ANGLE(x) ( (x) * 180.0 / PI ) // 弧度转换为角度 +#define PI ( 3.1415926535898 ) + +typedef enum +{ + TAU1201 = 1, // 逐飞科技双频GPS模块 + GN42A = 1, // 逐飞科技双频GPS模块 与TAU1201是一样的 + GN43RFA = 2, // 逐飞科技三频RTK模块 +}gps_device_enum; + +typedef struct +{ + uint16 year; + uint8 month; + uint8 day; + uint8 hour; + uint8 minute; + uint8 second; +}gps_time_struct; + +typedef struct +{ + gps_time_struct time; // 时间 + + uint8 state; // 有效状态 1:定位有效 0:定位无效 + + uint16 latitude_degree; // 度 + uint16 latitude_cent; // 分 + uint16 latitude_second; // 秒 这里的秒是被放大了100倍的,主要是避免使用浮点数 + uint16 longitude_degree; // 度 + uint16 longitude_cent; // 分 + uint16 longitude_second; // 秒 这里的秒是被放大了100倍的,主要是避免使用浮点数 + + double latitude; // 纬度 + double longitude; // 经度 + + int8 ns; // 纬度半球 N(北半球)或 S(南半球) + int8 ew; // 经度半球 E(东经)或 W(西经) + + float speed; // 速度(公里/每小时) + float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准)+ + uint8 antenna_direction_state; // 双天线测向有效状态 1:测向有效 0:测向无效,无效时antenna_direction数据是无效的 + float antenna_direction; // 主天线指向从天线与真北构成的夹角(000.0~359.9 度) + + // 下面两个个信息从GNGGA语句中获取 + uint8 satellite_used; // 用于定位的卫星数量 + float height; // 高度 +}gnss_info_struct; + +typedef enum +{ + GPS_STATE_RECEIVING, // 正在接收数据 + GPS_STATE_RECEIVED, // 数据接收完成 + GPS_STATE_PARSING, // 正在解析 +}gps_state_enum; + +extern gnss_info_struct gnss; +extern uint8 gnss_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); +uint8 gnss_data_parse (void); +void gnss_uart_callback (void); +void gnss_init (gps_device_enum gps_device); + +#endif diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_gps_tau1201.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_gps_tau1201.c deleted file mode 100644 index da46a99..0000000 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_gps_tau1201.c +++ /dev/null @@ -1,541 +0,0 @@ -/********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 -* Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 -* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 -* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* -* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 -* 甚至没有隐含的适销性或适合特定用途的保证 -* 更多细节请参见 GPL -* -* 您应该在收到本开源库的同时收到一份 GPL 的副本 -* 如果没有,请参阅 -* -* 额外注明: -* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 -* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 -* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 -* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* -* 文件名称 zf_device_gps_tau1201 -* 公司名称 成都逐飞科技有限公司 -* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D -* 店铺链接 https://seekfree.taobao.com/ -* -* 修改记录 -* 日期 作者 备注 -* 2022-09-15 pudding first version -* 2023-04-28 pudding 增加中文注释说明 -********************************************************************************************************************/ -/******************************************************************************************************************** -* 接线定义: -* ------------------------------------ -* 模块管脚 单片机管脚 -* RX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_RX 宏定义 -* TX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_TX 宏定义 -* VCC 3.3V电源 -* GND 电源地 -* ------------------------------------ -********************************************************************************************************************/ - -#include "math.h" -#include "zf_common_function.h" -#include "zf_common_fifo.h" -#include "zf_driver_delay.h" -#include "zf_driver_uart.h" - -#include "zf_device_gps_tau1201.h" - -#define GPS_TAU1201_BUFFER_SIZE ( 128 ) - -uint8 gps_tau1201_flag = 0; // 1:采集完成等待处理数据 0:没有采集完成 -gps_info_struct gps_tau1201; // GPS解析之后的数据 - -static uint8 gps_tau1201_state = 0; // 1:GPS初始化完成 -static fifo_obj_struct gps_tau1201_receiver_fifo; // -static uint8 gps_tau1201_receiver_buffer[GPS_TAU1201_BUFFER_SIZE]; // 数据存放数组 - -gps_state_enum gps_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 -gps_state_enum gps_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 - -static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; // GGA语句缓冲区 -static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; // RMC语句缓冲区 - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 获取指定 ',' 后面的索引 -// 参数说明 num 第几个逗号 -// 参数说明 *str 字符串 -// 返回参数 uint8 返回索引 -// 使用示例 get_parameter_index(1, s); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static uint8 get_parameter_index (uint8 num, char *str) -{ - uint8 i = 0, j = 0; - char *temp = strchr(str, '\n'); - uint8 len = 0, len1 = 0; - - 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; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 给定字符串第一个 ',' 之前的数据转换为int -// 参数说明 *s 字符串 -// 返回参数 float 返回数值 -// 使用示例 get_int_number(&buf[get_parameter_index(7, buf)]); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static int get_int_number (char *s) -{ - char buf[10]; - uint8 i = 0; - int return_value = 0; - i = get_parameter_index(1, s); - i = i - 1; - strncpy(buf, s, i); - buf[i] = 0; - return_value = func_str_to_int(buf); - return return_value; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 给定字符串第一个 ',' 之前的数据转换为float -// 参数说明 *s 字符串 -// 返回参数 float 返回数值 -// 使用示例 get_float_number(&buf[get_parameter_index(8, buf)]); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static float get_float_number (char *s) -{ - uint8 i = 0; - char buf[15]; - float return_value = 0; - - i = get_parameter_index(1, s); - i = i - 1; - strncpy(buf, s, i); - buf[i] = 0; - return_value = (float)func_str_to_double(buf); - return return_value; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 给定字符串第一个 ',' 之前的数据转换为double -// 参数说明 *s 字符串 -// 返回参数 double 返回数值 -// 使用示例 get_double_number(&buf[get_parameter_index(3, buf)]); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static double get_double_number (char *s) -{ - uint8 i = 0; - char buf[15]; - double return_value = 0; - - i = get_parameter_index(1, s); - i = i - 1; - strncpy(buf, s, i); - buf[i] = 0; - return_value = func_str_to_double(buf); - return return_value; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 世界时间转换为北京时间 -// 参数说明 *time 保存的时间 -// 返回参数 void -// 使用示例 utc_to_btc(&gps->time); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static void utc_to_btc (gps_time_struct *time) -{ - uint8 day_num = 0; - - time->hour = time->hour + 8; - if(23 < time->hour) - { - time->hour -= 24; - time->day += 1; - - if(2 == time->month) - { - day_num = 28; - if((0 == time->year % 4 && 0 != time->year % 100) || 0 == time->year % 400) // 判断是否为闰年 - { - day_num ++; // 闰月 2月为29天 - } - } - else - { - day_num = 31; // 1 3 5 7 8 10 12这些月份为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(12 < time->month) - { - time->month -= 12; - time->year ++; - } - } - } -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 RMC语句解析 -// 参数说明 *line 接收到的语句信息 -// 参数说明 *gps 保存解析后的数据 -// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 -// 使用示例 gps_gnrmc_parse((char *)data_buffer, &gps_tau1201); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static uint8 gps_gnrmc_parse (char *line, gps_info_struct *gps) -{ - uint8 state = 0, temp = 0; - - double latitude = 0; // 纬度 - double longitude = 0; // 经度 - - double lati_cent_tmp = 0, lati_second_tmp = 0; - double long_cent_tmp = 0, long_second_tmp = 0; - float speed_tmp = 0; - char *buf = line; - uint8 return_state = 0; - - state = buf[get_parameter_index(2, buf)]; - - gps->state = 0; - if('A' == state) // 如果数据有效 则解析数据 - { - return_state = 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; // 纬度转换为度分秒 - lati_cent_tmp = (latitude - gps->latitude_degree * 100); - gps->latitude_cent = (int)lati_cent_tmp; - lati_second_tmp = (lati_cent_tmp - gps->latitude_cent) * 6000; - gps->latitude_second = (int)lati_second_tmp; - - gps->longitude_degree = (int)longitude / 100; // 经度转换为度分秒 - long_cent_tmp = (longitude - gps->longitude_degree * 100); - gps->longitude_cent = (int)long_cent_tmp; - long_second_tmp = (long_cent_tmp - gps->longitude_cent) * 6000; - gps->longitude_second = (int)long_second_tmp; - - gps->latitude = gps->latitude_degree + lati_cent_tmp / 60; - gps->longitude = gps->longitude_degree + long_cent_tmp / 60; - - speed_tmp = get_float_number(&buf[get_parameter_index(7, buf)]); // 速度(海里/小时) - gps->speed = speed_tmp * 1.85f; // 转换为公里/小时 - gps->direction = get_float_number(&buf[get_parameter_index(8, buf)]); // 角度 - } - - // 在定位没有生效前也是有时间数据的,可以直接解析 - gps->time.hour = (buf[7] - '0') * 10 + (buf[8] - '0'); // 时间 - 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'); // 日期 - 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_state; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 GGA语句解析 -// 参数说明 *line 接收到的语句信息 -// 参数说明 *gps 保存解析后的数据 -// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 -// 使用示例 gps_gngga_parse((char *)data_buffer, &gps_tau1201); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static uint8 gps_gngga_parse (char *line, gps_info_struct *gps) -{ - uint8 state = 0; - char *buf = line; - uint8 return_state = 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)]); // 高度 = 海拔高度 + 地球椭球面相对大地水准面的高度 - return_state = 1; - } - - return return_state; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 计算从第一个点到第二个点的距离 -// 参数说明 latitude1 第一个点的纬度 -// 参数说明 longitude1 第一个点的经度 -// 参数说明 latitude2 第二个点的纬度 -// 参数说明 longitude2 第二个点的经度 -// 返回参数 double 返回两点距离 -// 使用示例 get_two_points_distance(latitude1_1, longitude1, latitude2, longitude2); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -double get_two_points_distance (double latitude1, double longitude1, double latitude2, double longitude2) -{ - const double EARTH_RADIUS = 6378137; // 地球半径(单位:m) - double rad_latitude1 = 0; - double rad_latitude2 = 0; - double rad_longitude1 = 0; - double rad_longitude2 = 0; - double distance = 0; - double a = 0; - double b = 0; - - rad_latitude1 = ANGLE_TO_RAD(latitude1); // 根据角度计算弧度 - 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 里面实现的算法 - distance = distance * EARTH_RADIUS; - - return distance; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 计算从第一个点到第二个点的方位角 -// 参数说明 latitude1 第一个点的纬度 -// 参数说明 longitude1 第一个点的经度 -// 参数说明 latitude2 第二个点的纬度 -// 参数说明 longitude2 第二个点的经度 -// 返回参数 double 返回方位角(0至360) -// 使用示例 get_two_points_azimuth(latitude1_1, longitude1, latitude2, longitude2); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -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 ((0 < angle) ? angle : (angle + 360)); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 解析GPS数据 -// 参数说明 void -// 返回参数 uint8 0-解析成功 1-解析失败 可能数据包错误 -// 使用示例 gps_data_parse(); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -uint8 gps_data_parse (void) -{ - uint8 return_state = 0; - uint8 check_buffer[5] = {'0', 'x', 0x00, 0x00, 0x00}; - uint8 bbc_xor_origin = 0; - uint8 bbc_xor_calculation = 0; - uint32 data_len = 0; - - do - { - if(GPS_STATE_RECEIVED == gps_rmc_state) - { - gps_rmc_state = GPS_STATE_PARSING; - strncpy((char *)&check_buffer[2], strchr((const char *)gps_rmc_buffer, '*') + 1, 2); - bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); - for(bbc_xor_calculation = gps_rmc_buffer[1], data_len = 2; '*' != gps_rmc_buffer[data_len]; data_len ++) - { - bbc_xor_calculation ^= gps_rmc_buffer[data_len]; - } - if(bbc_xor_calculation != bbc_xor_origin) - { - // 数据校验失败 - return_state = 1; - break; - } - - gps_gnrmc_parse((char *)gps_rmc_buffer, &gps_tau1201); - } - gps_rmc_state = GPS_STATE_RECEIVING; - - if(GPS_STATE_RECEIVED == gps_gga_state) - { - gps_gga_state = GPS_STATE_PARSING; - strncpy((char *)&check_buffer[2], strchr((const char *)gps_gga_buffer, '*') + 1, 2); - bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); - - for(bbc_xor_calculation = gps_gga_buffer[1], data_len = 2; '*' != gps_gga_buffer[data_len]; data_len ++) - { - bbc_xor_calculation ^= gps_gga_buffer[data_len]; - } - if(bbc_xor_calculation != bbc_xor_origin) - { - // 数据校验失败 - return_state = 1; - break; - } - - gps_gngga_parse((char *)gps_gga_buffer, &gps_tau1201); - } - gps_gga_state = GPS_STATE_RECEIVING; - - }while(0); - return return_state; -} - - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 GPS串口回调函数 -// 参数说明 void -// 返回参数 void -// 使用示例 gps_uart_callback(); -// 备注信息 此函数需要在串口接收中断内进行调用 -//------------------------------------------------------------------------------------------------------------------- -void gps_uart_callback (void) -{ - uint8 temp_gps[6]; - uint32 temp_length = 0; - - if(gps_tau1201_state) - { - uint8 dat; - while(uart_query_byte(GPS_TAU1201_UART, &dat)) - { - fifo_write_buffer(&gps_tau1201_receiver_fifo, &dat, 1); - } - - if('\n' == dat) - { - // 读取前6个数据 用于判断语句类型 - temp_length = 6; - fifo_read_buffer(&gps_tau1201_receiver_fifo, temp_gps, &temp_length, FIFO_READ_ONLY); - - // 根据不同类型将数据拷贝到不同的缓冲区 - if(0 == strncmp((char *)&temp_gps[3], "RMC", 3)) - { - // 如果没有在解析数据则更新缓冲区的数据 - if(GPS_STATE_PARSING != gps_rmc_state) - { - gps_rmc_state = GPS_STATE_RECEIVED; - temp_length = fifo_used(&gps_tau1201_receiver_fifo); - fifo_read_buffer(&gps_tau1201_receiver_fifo, gps_rmc_buffer, &temp_length, FIFO_READ_AND_CLEAN); - } - } - else if(0 == strncmp((char *)&temp_gps[3], "GGA", 3)) - { - // 如果没有在解析数据则更新缓冲区的数据 - if(GPS_STATE_PARSING != gps_gga_state) - { - gps_gga_state = GPS_STATE_RECEIVED; - temp_length = fifo_used(&gps_tau1201_receiver_fifo); - fifo_read_buffer(&gps_tau1201_receiver_fifo, gps_gga_buffer, &temp_length, FIFO_READ_AND_CLEAN); - } - } - - // 统一将FIFO清空 - fifo_clear(&gps_tau1201_receiver_fifo); - - gps_tau1201_flag = 1; - } - } -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 GPS初始化 -// 参数说明 void -// 返回参数 void -// 使用示例 gps_init(); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -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}; - - fifo_init(&gps_tau1201_receiver_fifo, FIFO_DATA_8BIT, gps_tau1201_receiver_buffer, GPS_TAU1201_BUFFER_SIZE); - system_delay_ms(500); // 等待GPS启动后开始初始化 - uart_init(GPS_TAU1201_UART, 115200, GPS_TAU1201_RX, GPS_TAU1201_TX); - uart_rx_interrupt(GPS_TAU1201_UART, 0); - - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)set_rate, sizeof(set_rate)); // 设置GPS更新速率为10hz 如果不调用此语句则默认为1hz - system_delay_ms(200); - - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)open_rmc, sizeof(open_rmc)); // 开启rmc语句 - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)open_gga, sizeof(open_gga)); // 开启gga语句 - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gll, sizeof(close_gll)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gsa, sizeof(close_gsa)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_grs, sizeof(close_grs)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gsv, sizeof(close_gsv)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_vtg, sizeof(close_vtg)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_zda, sizeof(close_zda)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gst, sizeof(close_gst)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_txt, sizeof(close_txt)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_txt_ant, sizeof(close_txt_ant)); - system_delay_ms(50); - - gps_tau1201_state = 1; - uart_rx_interrupt(GPS_TAU1201_UART, 1); -} diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_gps_tau1201.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_gps_tau1201.h deleted file mode 100644 index c167bae..0000000 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_gps_tau1201.h +++ /dev/null @@ -1,117 +0,0 @@ -/********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 -* Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 -* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 -* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* -* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 -* 甚至没有隐含的适销性或适合特定用途的保证 -* 更多细节请参见 GPL -* -* 您应该在收到本开源库的同时收到一份 GPL 的副本 -* 如果没有,请参阅 -* -* 额外注明: -* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 -* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 -* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 -* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* -* 文件名称 zf_device_gps_tau1201 -* 公司名称 成都逐飞科技有限公司 -* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D -* 店铺链接 https://seekfree.taobao.com/ -* -* 修改记录 -* 日期 作者 备注 -* 2022-09-15 pudding first version -* 2023-04-28 pudding 增加中文注释说明 -********************************************************************************************************************/ -/******************************************************************************************************************** -* 接线定义: -* ------------------------------------ -* 模块管脚 单片机管脚 -* RX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_RX 宏定义 -* TX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_TX 宏定义 -* VCC 3.3V电源 -* GND 电源地 -* ------------------------------------ -********************************************************************************************************************/ - -#ifndef _zf_device_gps_tau1201_h_ -#define _zf_device_gps_tau1201_h_ - -#include "zf_common_typedef.h" - -//=================================================定义 定位模块 基本配置================================================ -#define GPS_TAU1201_UART (UART_3) -#define GPS_TAU1201_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 -#define GPS_TAU1201_TX (UART3_RX_P15_7) // GPS TX串口引脚 - -#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 -#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 -#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; // 时间- - uint8 state; // 有效状态 1:定位有效 0:定位无效 - uint16 latitude_degree; // 度 - uint16 latitude_cent; // 分 - uint16 latitude_second; // 秒 - uint16 longitude_degree; // 度 - uint16 longitude_cent; // 分 - uint16 longitude_second; // 秒 - double latitude; // 纬度 - double longitude; // 经度 - int8 ns; // 纬度半球 N(北半球)或 S(南半球) - int8 ew; // 经度半球 E(东经)或 W(西经) - float speed; // 速度(公里/每小时) - float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) - // 下面两个个信息从GNGGA语句中获取 - uint8 satellite_used; // 用于定位的卫星数量 - float height; // 高度 -}gps_info_struct; - -typedef enum -{ - GPS_STATE_RECEIVING, // 正在接收数据 - GPS_STATE_RECEIVED, // 数据接收完成 - GPS_STATE_PARSING, // 正在解析 -}gps_state_enum; -//================================================定义 定位模块 参数结构体================================================ - - -//=================================================声明 定位模块 全局变量================================================ -extern gps_info_struct gps_tau1201; // GPS解析之后的数据 -extern uint8 gps_tau1201_flag; // 1:采集完成等待处理数据 0:没有采集完成 -//=================================================声明 定位模块 全局变量================================================ - - -//=================================================声明 定位模块 基础函数================================================ -double get_two_points_distance (double lat1, double lng1, double lat2, double lng2); // 计算从第一个点到第二个点的距离(单位:m) -double get_two_points_azimuth (double lat1, double lon1, double lat2, double lon2); // 计算从第一个点到第二个点的方位角(单位:°) -uint8 gps_data_parse (void); // 解析GPS数据 -void gps_uart_callback (void); // GPS回调函数 -void gps_init (void); // GPS初始化 -//=================================================声明 定位模块 基础函数================================================ -#endif diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_icm20602.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_icm20602.c index f4ae830..ddebf3c 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_icm20602.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_icm20602.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_icm20602 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_icm20602.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_icm20602.h index 67724ad..209972b 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_icm20602.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_icm20602.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_icm20602 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_imu660ra.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_imu660ra.c index 95144f9..02fdb9e 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_imu660ra.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_imu660ra.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu660ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_imu660ra.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_imu660ra.h index a689df1..348e6a1 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_imu660ra.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_imu660ra.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu660ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_imu963ra.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_imu963ra.c index 92ec0f6..595142a 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_imu963ra.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_imu963ra.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu963ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_imu963ra.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_imu963ra.h index 4d0d9f9..c0f981f 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_imu963ra.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_imu963ra.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu963ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ips114.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ips114.c index 78c6f3b..b13e338 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ips114.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ips114.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips114 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ips114.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ips114.h index 81dfc3c..ba932b1 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ips114.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ips114.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips114 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ips200.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ips200.c index cd8681f..37d9d04 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ips200.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ips200.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips200 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ips200.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ips200.h index ce59927..045bf27 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ips200.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ips200.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips200 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_key.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_key.c index 9e42c8a..8b240cb 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_key.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_key.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_key * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_key.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_key.h index bcab8aa..9c653cf 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_key.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_key.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_key * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_mpu6050.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_mpu6050.c index dc3c5b2..101a5ae 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_mpu6050.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_mpu6050.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_mpu6050 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_mpu6050.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_mpu6050.h index 3510e06..c8a086f 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_mpu6050.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_mpu6050.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_mpu6050 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_mt9v03x.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_mt9v03x.c index 231cfec..d38b8df 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_mt9v03x.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_mt9v03x.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_mt9v03x * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_mt9v03x.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_mt9v03x.h index 7786bc5..9d4650d 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_mt9v03x.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_mt9v03x.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_mt9v03x * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_oled.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_oled.c index 5314209..55aefa7 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_oled.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_oled.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_oled * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_oled.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_oled.h index d52d2fd..aadf048 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_oled.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_oled.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_oled * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ov7725.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ov7725.c index 12f6095..bac95fe 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ov7725.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ov7725.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ov7725 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ov7725.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ov7725.h index f45a4e8..2cb4026 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ov7725.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ov7725.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ov7725 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_scc8660.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_scc8660.c index 3483c93..38d65ff 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_scc8660.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_scc8660.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_scc8660 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_scc8660.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_scc8660.h index 815d272..537283a 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_scc8660.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_scc8660.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_scc8660 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_tft180.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_tft180.c index db50824..b661e91 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_tft180.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_tft180.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_tft180 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_tft180.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_tft180.h index 47491ee..54a72b3 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_tft180.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_tft180.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_tft180 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_tsl1401.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_tsl1401.c index 3f9db7f..d133c7c 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_tsl1401.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_tsl1401.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_tsl1401 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_tsl1401.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_tsl1401.h index 1fab12e..a7b061c 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_tsl1401.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_tsl1401.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_tsl1401 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_type.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_type.c index 497ba55..af24701 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_type.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_type.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_type * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -32,6 +32,7 @@ * 日期 作者 备注 * 2022-09-15 pudding first version * 2023-05-26 pudding 新增SPI WIFI 中断回调指针 +* 2024-01-16 pudding 移除SPI WIFI 中断回调指针 SPI WIFI将不再使用外部 ********************************************************************************************************************/ #include "zf_device_type.h" @@ -45,7 +46,6 @@ callback_function camera_dma_handler = type_default_callback; wireless_type_enum wireless_type = NO_WIRELESS; callback_function wireless_module_uart_handler = type_default_callback; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 -callback_function wireless_module_spi_handler = type_default_callback; // WIFI SPI GPIO中断函数指针,根据初始化时设置的函数进行跳转 tof_type_enum tof_type = NO_TOF; callback_function tof_module_exti_handler = type_default_callback; // ToF 模块 INT 更新中断 @@ -54,7 +54,7 @@ callback_function tof_module_exti_handler = type_default_callback; // 函数简介 默认回调函数 // 参数说明 void // 返回参数 void -// 使用示例 +// 使用示例 // 备注信息 保护性冗余设计 防止在没有初始化设备的时候跑飞 //------------------------------------------------------------------------------------------------------------------- static void type_default_callback (void) @@ -90,14 +90,7 @@ void set_camera_type (camera_type_enum type_set, callback_function vsync_callba void set_wireless_type (wireless_type_enum type_set, callback_function wireless_callback) { wireless_type = type_set; - if(WIFI_SPI == wireless_type) - { - wireless_module_spi_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); - } - else - { - wireless_module_uart_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); - } + wireless_module_uart_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); } //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_type.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_type.h index 19c36ca..3b124fe 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_type.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_type.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_type * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -56,7 +56,6 @@ typedef enum WIRELESS_UART, // 无线串口 BLUETOOTH_CH9141, // 蓝牙 CH9141 WIFI_UART, // 串口 WiFi - WIFI_SPI // SPI WiFi }wireless_type_enum; typedef enum diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c index 2bdb164..3cbc786 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_virtual_oscilloscope * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h index f518026..b0fd085 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_virtual_oscilloscope * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_wifi_spi.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_wifi_spi.c index 78a6d68..f9e51ca 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_wifi_spi.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_wifi_spi.c @@ -24,14 +24,13 @@ * 文件名称 zf_device_wifi_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 * 日期 作者 备注 -* 2023-05-27 pudding first version -* 2023-05-29 pudding 新增关闭休眠指令,提升通讯效率 +* 2022-09-21 SeekFree first version ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,1374 +52,615 @@ #include "zf_common_clock.h" #include "zf_common_debug.h" #include "zf_common_fifo.h" -#include "zf_common_function.h" #include "zf_driver_delay.h" #include "zf_driver_gpio.h" -#include "zf_common_interrupt.h" -#include "zf_driver_exti.h" #include "zf_driver_spi.h" #include "zf_device_type.h" #include "zf_device_wifi_spi.h" -#define WAIT_TIME_OUT (10000) // 单指令等待时间 单位:ms +#define WIFI_CONNECT_TIME_OUT 10000 // 单位毫秒 +#define SOCKET_CONNECT_TIME_OUT 50000 // 单位毫秒 +#define OTHER_TIME_OUT 1000 // 单位毫秒 -#define WIFI_SPI_WRITE_MAX 128 // 定义一次SPI通讯最大发送的数据长度 - -#define WIFI_SPI_WRITE_REQUEST 0x01 -#define WIFI_SPI_CHECK_STATE 0x02 -#define WIFI_SPI_WRITE_DATA 0x03 -#define WIFI_SPI_READ_DATA 0x04 -#define WIFI_SPI_WRITE_END 0x07 -#define WIFI_SPI_READ_END 0x08 - -#define WIFI_SPI_WRITE_ADDR 0x00 -#define WIFI_SPI_STATE_ADDR 0x04 +char wifi_spi_version[12]; // 保存模块固件版本信息 +char wifi_spi_mac_addr[20]; // 保存模块MAC地址信息 +char wifi_spi_ip_addr_port[25]; // 保存模块IP地址与端口信息 -volatile wifi_spi_buffer_state_enum wifi_buffer_state; -volatile wifi_spi_transmit_state_enum wifi_transmit_state; - -static fifo_obj_struct wifi_spi_fifo; -static uint8 wifi_spi_buffer[WIFI_SPI_BUFFER_SIZE]; // 数据存放数组 - -vuint8 wifi_spi_ack_flag = 0; // 0:模块未应答 1:模块已应答 -uint8 wifi_spi_init_flag; // 0:模块未初始化成功或者未连接 1:模块已连接并成功初始化 -vuint8 wifi_spi_packet_num; // 发送的数据包ID -vuint32 wifi_spi_send_remain_length; // 剩余的发送长度 - - - -wifi_spi_information_struct wifi_spi_information; +static fifo_struct wifi_spi_fifo; +static uint8 wifi_spi_buffer[WIFI_SPI_RECVIVE_FIFO_SIZE]; +static volatile wifi_spi_state_enum wifi_spi_mutex; //------------------------------------------------------------------------------------------------------------------- -// 函数简介 请求写入数据到模块 -// 参数说明 length 需要写入的长度 -// @return void -// Sample usage: +// 函数简介 等待WIFI SPI就绪 +// 参数说明 wait_time 最大等待时间 单位毫秒 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_write_request(uint16 length) +static uint8 wifi_spi_wait_idle (uint32 wait_time) { - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_REQUEST; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - head.magic = 0xFE; - head.sequence = wifi_spi_packet_num++; - head.length = length; + uint32 time = 0; - wifi_transmit_state = TRANSMIT_WRITE_REQUEST; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 7); - gpio_set_level(WIFI_SPI_CS_PIN, 1); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 读取模块状态 -// 参数说明 *length 需要读取或者写入的长度 -// @return WIFI_SPI_BUFFER_STATE_enum 模块状态 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static wifi_spi_buffer_state_enum wifi_spi_read_state(uint16 *length) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_CHECK_STATE; - head.addr = WIFI_SPI_STATE_ADDR; - head.dummy = 0x00; - - wifi_spi_ack_flag = 0; - wifi_transmit_state = TRANSMIT_READ_STATE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_transfer_8bit(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, &head.cmd, 7); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - - if(BUFFER_WRITE == head.magic) + wait_time = wait_time*100; + while(0 == gpio_get_level(WIFI_SPI_INT_PIN)) { - wifi_spi_packet_num = head.sequence; - } - *length = head.length; - - return (wifi_spi_buffer_state_enum)head.magic; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据发送完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_done(void) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_END; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_transmit_state = TRANSMIT_IDLE; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据接收完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_start(void) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_READ_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - wifi_transmit_state = TRANSMIT_READ; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据接收完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_done(void) -{ - wifi_spi_buffer_struct head; - - gpio_set_level(WIFI_SPI_CS_PIN, 1); - - head.cmd = WIFI_SPI_READ_END; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_transmit_state = TRANSMIT_IDLE; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块 -// 参数说明 *buff 需要写入数据的首地址 -// 参数说明 length 需要写入数据的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_data(const uint8 *buff, uint16 length) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - wifi_transmit_state = TRANSMIT_WRITE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - spi_write_8bit_array(WIFI_SPI_INDEX, buff, length); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_spi_send_done(); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_data_multi(wifi_spi_send_multi_struct *multi_buffer) -{ - uint8 i; - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - wifi_transmit_state = TRANSMIT_WRITE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - - for(i = 0; i < WIFI_SPI_MAX_MULTI; i++) - { - if(NULL != multi_buffer->source[i]) spi_write_8bit_array(WIFI_SPI_INDEX, multi_buffer->source[i], multi_buffer->length[i]); - } - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_spi_send_done(); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 接收模块发送的数据 -// 参数说明 *buff 接收数组的缓冲区首地址 -// 参数说明 length 需要接收的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_data(uint8 *buff, uint16 length) -{ - spi_read_8bit_array(WIFI_SPI_INDEX, buff, length); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送命令到模块 -// 参数说明 *str 命令字符串首地址 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_command(const char *str) -{ - uint8 state = 0; - uint16 send_length; - uint16 wait_time = 0; - - // 请求发送数据 - send_length = (uint16)strlen(str); - - // 等待传输进入空闲 - while(TRANSMIT_IDLE != wifi_transmit_state); - - // 如果没有进入发送状态则重新请求发送数据 - while(BUFFER_WRITE != wifi_buffer_state) - { - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - while(!wifi_spi_ack_flag) - { - wait_time++; - if((WAIT_TIME_OUT / 4) <= wait_time) - { - state = 1; - wifi_spi_init_flag = 0; // 模块已断开 - break; - } - system_delay_ms(1); - } - - if(1 == state) + system_delay_us(10); + time++; + if(wait_time <= time) { break; } } - - wifi_buffer_state = BUFFER_IDLE; - - if(0 == state) // 通讯未超时 - { - wifi_spi_send_remain_length = send_length; - // 发送消息 - wifi_spi_send_data((const uint8 *)str, send_length); - } + return (wait_time <= time); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 检查模块状态并读取模块发送的数据 -// 参数说明 void -// @return void -// Sample usage: +// 函数简介 写入数据到WIFI SPI +// 参数说明 *buffer1 第一组需要发送的数据缓冲区地址 +// 参数说明 length1 第一组数据长度 +// 参数说明 *buffer2 第二组需要发送的数据缓冲区地址 +// 参数说明 length2 第二组数据长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -void wifi_spi_check_state_read_buffer(void) +static void wifi_spi_write (const uint8 *buffer1, uint16 length1, const uint8 *buffer2, uint16 length2) { - uint16 wifi_spi_receive_length; // 本次接收到的数据数量 - uint8 wifi_spi_receive_buffer[WIFI_SPI_WRITE_MAX]; - - // 查询WIFI模块的状态 - wifi_buffer_state = wifi_spi_read_state(&wifi_spi_receive_length); - - // 如果需要读取WIFI模块数据,则保存需要读取的长度 - if(BUFFER_READ == wifi_buffer_state) + gpio_low(WIFI_SPI_CS_PIN); + if(NULL != buffer1) { - wifi_spi_receive_start(); - do - { - if(wifi_spi_receive_length > WIFI_SPI_WRITE_MAX) - { - wifi_spi_receive_data((uint8 *)wifi_spi_receive_buffer, WIFI_SPI_WRITE_MAX); - fifo_write_buffer(&wifi_spi_fifo, wifi_spi_receive_buffer, WIFI_SPI_WRITE_MAX); // 存入 FIFO - wifi_spi_receive_length = wifi_spi_receive_length - WIFI_SPI_WRITE_MAX; - } - else - { - wifi_spi_receive_data((uint8 *)wifi_spi_receive_buffer, wifi_spi_receive_length); - fifo_write_buffer(&wifi_spi_fifo, wifi_spi_receive_buffer, wifi_spi_receive_length); // 存入 FIFO - wifi_spi_receive_length = 0; - } - }while(wifi_spi_receive_length > 0); - wifi_spi_receive_done(); + spi_write_8bit_array(WIFI_SPI_INDEX, buffer1, length1); } - else if(BUFFER_IDLE == wifi_buffer_state) + if(NULL != buffer2) { - // 如果模块内部缓冲区状态为空闲,则传输状态也设置为空闲 - wifi_transmit_state = TRANSMIT_IDLE; + spi_write_8bit_array(WIFI_SPI_INDEX, buffer2, length2); } + gpio_high(WIFI_SPI_CS_PIN); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块 -// 参数说明 *buff 需要发送的数据首地址 -// 参数说明 length 需要发送的长度 -// @return uint32 剩余未发送长度 -// Sample usage: +// 函数简介 WIFI SPI 发送与接收同时进行(命令收发) +// 参数说明 *packets 发送与接收的地址 +// 参数说明 length 需要接收的长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_write_data(const uint8 *buff, uint32 length) +static void wifi_spi_transfer_command (wifi_spi_packets_struct *packets, uint16 length) { - uint16 send_length; - uint32 wait_time; + gpio_low(WIFI_SPI_CS_PIN); - // 记录需要发送的长度 - wifi_spi_send_remain_length = length; - - while(wifi_spi_send_remain_length) + spi_transfer_8bit(WIFI_SPI_INDEX, (uint8 *)&(packets->head), (uint8 *)&(packets->head), sizeof(wifi_spi_head_struct)); + + if(length) { - send_length = (uint16)func_limit_ab(wifi_spi_send_remain_length, 1, WIFI_SPI_WRITE_MAX); - - // 请求发送数据 - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - - // 最长等待5秒 - wait_time = 5000; - while(!wifi_spi_ack_flag) - { - wait_time--; - if(0 == wait_time) break; - system_delay_ms(1); - } - - if(BUFFER_WRITE == wifi_buffer_state) - { - // 发送消息 - wifi_spi_send_data(buff, send_length); - buff += send_length; - wifi_spi_send_remain_length -= send_length; - wifi_buffer_state = BUFFER_IDLE; - } - else - { - break; - } + spi_transfer_8bit(WIFI_SPI_INDEX, (const uint8 *)(packets->buffer), packets->buffer, length); } - - return wifi_spi_send_remain_length; + + gpio_high(WIFI_SPI_CS_PIN); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// @return uint32 剩余未发送长度 -// Sample usage: 发送数据总长度不能超过4092个 +// 函数简介 WIFI SPI 发送与接收同时进行(数据收发) +// 参数说明 *write_data 发送的数据缓冲区地址 +// 参数说明 *read_data 接收到的数据的存储地址 +// 参数说明 length 需要接收的长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_write_data_multi(wifi_spi_send_multi_struct *multi_buffer) +static void wifi_spi_transfer_data (const uint8 *write_data, wifi_spi_packets_struct *read_data, uint16 length) { - uint16 send_length; - uint32 wait_time; + gpio_low(WIFI_SPI_CS_PIN); - // 记录需要发送的长度 - send_length = multi_buffer->length[0] + multi_buffer->length[1] + multi_buffer->length[2] + multi_buffer->length[3] + multi_buffer->length[4] + multi_buffer->length[5] + multi_buffer->length[6] + multi_buffer->length[7]; + read_data->head.command = WIFI_SPI_DATA; + read_data->head.length = length; - if(WIFI_SPI_WRITE_MAX >= send_length) + spi_transfer_8bit(WIFI_SPI_INDEX, (uint8 *)&(read_data->head), (uint8 *)&(read_data->head), sizeof(wifi_spi_head_struct)); + + if(WIFI_SPI_RECVIVE_SIZE < length) { - // 请求发送数据 - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - - // 最长等待5秒 - wait_time = 5000; - while(!wifi_spi_ack_flag) - { - wait_time--; - if(0 == wait_time) break; - system_delay_ms(1); - } - - if(BUFFER_WRITE == wifi_buffer_state) - { - // 发送消息 - wifi_spi_send_data_multi(multi_buffer); - send_length = 0; - wifi_buffer_state = BUFFER_IDLE; - } + spi_transfer_8bit(WIFI_SPI_INDEX, write_data, read_data->buffer, WIFI_SPI_RECVIVE_SIZE); + spi_write_8bit_array(WIFI_SPI_INDEX, &write_data[WIFI_SPI_RECVIVE_SIZE], length - WIFI_SPI_RECVIVE_SIZE); } - - return send_length; + else + { + // 将需要发送的数据拷贝到读取缓冲区,避免出现write_data越界访问 + memcpy(read_data->buffer, write_data, length); + spi_transfer_8bit(WIFI_SPI_INDEX, read_data->buffer, read_data->buffer, WIFI_SPI_RECVIVE_SIZE); + } + gpio_high(WIFI_SPI_CS_PIN); } -//-------------------------------------------------------------------------------------------------- -// 函数简介 等待模块响应 -// 参数说明 *wait_buffer 等待的响应的字符串 -// 参数说明 timeout 超时时间 -// 返回参数 uint8 0:模块响应指定数据 1:模块未响应指定数据或超时 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_wait_ack (char *wait_buffer, uint32 timeout) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 参数设置 +// 参数说明 command 命令类型 +// 参数说明 *buffer 参数地址 +// 参数说明 length 参数长度 +// 参数说明 wait_time 最大等待时间 单位100微妙 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_set_parameter (wifi_spi_packets_command_enum command, uint8 *buffer, uint16 length, uint32 wait_time) { - uint8 return_state = 1; - char receiver_buffer[8] = {0, 0, 0, 0, 0, 0, 0, 0}; - uint32 receiver_len = 8; - + uint8 return_state; + wifi_spi_head_struct head; + return_state = 1; do { - system_delay_ms(1); - // 判断接收缓冲区内是否有需要响应的指定数据 如果有 则跳出循环并且返回0 - receiver_len = 8; - fifo_read_tail_buffer(&wifi_spi_fifo, (uint8 *)receiver_buffer, &receiver_len, FIFO_READ_ONLY); + head.command = command; + head.length = length; + + // 等待从机准备就绪 + if(wifi_spi_wait_idle(wait_time)) + { + break; + } - if(strstr(receiver_buffer, wait_buffer)) + wifi_spi_write(&head.command, sizeof(wifi_spi_head_struct), buffer, length); + if(wifi_spi_wait_idle(wait_time)) + { + break; + } + // 接收应答信号 + + head.command = WIFI_SPI_DATA; + head.length = 0; + wifi_spi_transfer_command((wifi_spi_packets_struct *)&head, head.length); + system_delay_us(20); + if(WIFI_SPI_REPLY_OK == head.command) { return_state = 0; - break; } - else if(strstr(receiver_buffer, "ERROR") || strstr(receiver_buffer, "busy")) - { - // 如果接收到报错或者模块忙 则跳出循环并且返回1 - return_state = 1; - break; - } - }while(timeout --); + }while(0); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 清除WiFi接收缓冲区内容 -// 参数说明 void -// 返回参数 void -// 使用示例 wifi_spi_clear_receive_buffer(); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static void wifi_spi_clear_receive_buffer (void) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 模块信息获取 +// 参数说明 command 命令类型 +// 参数说明 *buffer 保存接收到的参数地址 +// 参数说明 wait_time 最大等待时间 单位100微妙 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_parameter (wifi_spi_packets_command_enum command, wifi_spi_packets_struct *read_data, uint32 wait_time) { - // 清空WiFi接收缓冲区 - fifo_clear(&wifi_spi_fifo); -} + uint8 return_state; -//-------------------------------------------------------------------------------------------------- -// 函数简介 模块数据解析 -// 参数说明 *target_buffer 目标存放地址指针 字符串数组 -// 参数说明 *origin_buffer 数据来源地址指针 字符串数组 -// 参数说明 start_char 起始提取字节 例如从 "1234" 中从 '2' 开始提取 就应该填入 '2' -// 参数说明 end_char 结束提取字节 例如从 "1234" 中在 '4' 结束提取 就应该填入 '\0'(0x00 空字符 一般是字符串结尾) -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_data_parse(wifi_spi_information.mac, wifi_spi_receive_buffer, '"', '"'); // 调用获取本机mac地址后,调用此函数提取mac地址 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char start_char, char end_char) -{ - uint8 return_state = 0; - char *location1; - char *location2; - location1 = strchr((char *)origin_buffer, start_char); - if(location1) + return_state = 1; + do { - location1 ++; - location2 = strchr(location1, end_char); - if(location2) + // 等待从机准备就绪 + if(wifi_spi_wait_idle(wait_time)) { - memcpy(target_buffer, location1, location2-location1); + break; } - else + read_data->head.command = command; + wifi_spi_write(&(read_data->head.command), WIFI_SPI_RECVIVE_SIZE, NULL, 0); + + if(wifi_spi_wait_idle(wait_time)) { - return_state = 1; + break; } - } - else - { - return_state = 1; - } + read_data->head.command = WIFI_SPI_DATA; + read_data->head.length = 0; + wifi_spi_transfer_command(read_data, WIFI_SPI_RECVIVE_SIZE); + return_state = 0; + }while(0); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 查看模块版本信息 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_get_version(); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 固件版本获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,固件版本信息以字符串形式保存在wifi_spi_version数组中 +//------------------------------------------------------------------------------------------------------------------- static uint8 wifi_spi_get_version (void) { - char *location1; - uint8 return_state = 0; - uint8 receiver_buffer[256]; - uint32 receiver_len = 256; + uint8 return_state; + wifi_spi_packets_struct temp_packets; - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+GMR\r\n"); - do + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_VERSION, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_VERSION == temp_packets.head.command)) { - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - location1 = strrchr((char *)receiver_buffer, ':'); - if(wifi_spi_data_parse(wifi_spi_information.version, (uint8 *)location1, ':', '(')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - + memcpy(wifi_spi_version, temp_packets.buffer, temp_packets.head.length); + } return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 模块回显设置 -// 参数说明 model 0:关闭模块的回写功能 其他:开启模块回写 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_echo_set("1");//开启模块回写功能 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_echo_set (char *model) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI MAC地址获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,MAC地址信息以字符串形式保存在wifi_spi_mac_addr数组中 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_mac_addr (void) { - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - if('1' == *model) + uint8 return_state; + wifi_spi_packets_struct temp_packets; + + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_MAC_ADDR, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_MAC_ADDR == temp_packets.head.command)) { - wifi_spi_send_command("ATE1\r\n"); + memcpy(wifi_spi_mac_addr, temp_packets.buffer, temp_packets.head.length); + } + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI IP地址与端口号获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 +// 需要在连接Socket之后调用此函数才能正常获取信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_ip_addr_port (void) +{ + uint8 return_state; + wifi_spi_packets_struct temp_packets; + + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_IP_ADDR, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_IP_ADDR == temp_packets.head.command)) + { + memcpy(wifi_spi_ip_addr_port, temp_packets.buffer, temp_packets.head.length); + } + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 设置连接的WiFi信息并尝试连接WiFi +// 参数说明 *wifi_ssid WIFI名称 +// 参数说明 *pass_word WIFI密码 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_wifi_connect("SEEKFREE", "SEEKFREE123"); +// 备注信息 wifi_spi_wifi_connect("SEEKFREE", NULL); // 连接没有密码的WIFI热点 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_wifi_connect (char *wifi_ssid, char *pass_word) +{ + uint8 return_state; + uint8 temp_buffer[64]; + uint16 length; + + if(NULL != pass_word) + { + // WIFI热点有密码发送热点名称与密码 + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n%s\r\n", wifi_ssid, pass_word); } else { - wifi_spi_send_command("ATE0\r\n"); + // WIFI热点没有密码只需要发送热点名称 + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n", wifi_ssid); } - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + return_state = wifi_spi_set_parameter(WIFI_SPI_SET_WIFI_INFORMATION, temp_buffer, length, WIFI_CONNECT_TIME_OUT); + + // 本机IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 + wifi_spi_get_ip_addr_port(); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块自身 的 MAC 地址 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_mac()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_mac (void) -{ - uint8 return_state = 0; - uint8 receiver_buffer[64]; - uint32 receiver_len = 64; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPAPMAC?\r\n"); - do - { - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - if(wifi_spi_data_parse(wifi_spi_information.mac, receiver_buffer, '"', '"')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块或者目标WIFI 的 IP 地址(取决于模块当前的工作模式) -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_ip()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_ip (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_STATION == wifi_spi_information.mode) - { - wifi_spi_send_command("AT+CIPSTA?\r\n"); - } - else if(WIFI_SPI_SOFTAP == wifi_spi_information.mode) - { - wifi_spi_send_command("AT+CIPAP?\r\n"); - } - - do - { - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - uint8 receiver_buffer[128]; - uint32 receiver_len = 128; - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - if(wifi_spi_data_parse(wifi_spi_information.local_ip, receiver_buffer, '"', '"')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块的相关信息 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_information()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_information (void) -{ - uint8 return_state = 0; - do - { - // 获取模块版本号 - if(wifi_spi_get_version()) - { - return_state = 1; - break; - } - // 获取模块IP地址 - if(wifi_spi_get_ip()) - { - return_state = 1; - break; - } - // 获取模块MAC信息 - if(wifi_spi_get_mac()) - { - return_state = 1; - break; - } - memcpy(wifi_spi_information.local_port, "no port", 7); - }while(0); - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 连接 WiFi -// 参数说明 wifi_ssid WiFi名称 -// 参数说明 pass_word WiFi密码 -// 参数说明 model 0:查询WiFi连接情况 其他:连接WiFi -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_get_or_connect_wifi("WiFi_name", "Pass_word", 1); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_wifi (char *wifi_ssid, char *pass_word) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SOFTAP == wifi_spi_information.mode) - { - sprintf(temp, "AT+CWSAP=\"%s\",\"%s\",5,3\r\n", wifi_ssid, pass_word); - wifi_spi_send_command(temp); - } - else - { - sprintf(temp, "AT+CWJAP=\"%s\",\"%s\"\r\n", wifi_ssid, pass_word); - wifi_spi_send_command(temp); - } - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 上电是否自动连接WiFi -// 参数说明 model 0:上电不自动连接wifi 其他:上电自动连接wifi -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_auto_connect_wifi(0); //上电不自动连接wifi -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_auto_connect_wifi (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CWAUTOCONN=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置连接模式 -// 参数说明 model 0: 单连接模式 1:多连接模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_connect_model("1"); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_connect_model (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPMUX=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置传输模式 -// 参数说明 model – 0: 普通传输模式 IP断开后不重新连接 -// – 1: Wi-Fi 透传接收模式,仅支持 TCP 单连接、UDP 固定通信对端、SSL 单连接的情况 IP断开后会不断尝试重新连接 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_transfer_model("1"); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_transfer_model (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPMODE=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置模块模式 (Station/SoftAP/Station+SoftAP) -// 参数说明 state 0:无 Wi-Fi 模式,并且关闭 Wi-Fi RF----1: Station 模式----2: SoftAP 模式----3: SoftAP+Station 模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_model("1"); +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 设置连接的Socket信息并尝试连接Socket +// 参数说明 *transport_type 传输类型 +// 参数说明 *ip_addr IP地址 +// 参数说明 *port 目标端口号 +// 参数说明 *local_port 本机端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_socket_connect("TCP", "192.168.2.5", "8080", "6060"); // 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_set_model (wifi_spi_mode_enum mode) +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_socket_connect (char *transport_type, char *ip_addr, char *port, char *local_port) { - uint8 return_state = 0; + uint8 return_state; + uint8 temp_buffer[41]; + uint16 length; + + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n%s\r\n%s\r\n%s\r\n", transport_type, ip_addr, port, local_port); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + return_state = wifi_spi_set_parameter(WIFI_SPI_SET_SOCKET_INFORMATION, temp_buffer, length, SOCKET_CONNECT_TIME_OUT); - if(WIFI_SPI_SOFTAP == mode) - { - wifi_spi_send_command("AT+CWMODE=2\r\n"); - } - else - { - wifi_spi_send_command("AT+CWMODE=1\r\n"); - } - // 设置模块工作模式 - wifi_spi_information.mode = mode; - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + // 本机IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 + wifi_spi_get_ip_addr_port(); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 关闭睡眠模式 -// 参数说明 mode -// 返回参数 uint8 0:成功 1:失败 +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 断开Socket连接 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_socket_disconnect(); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_socket_disconnect (void) +{ + wifi_spi_packets_struct temp_packets; + + return wifi_spi_get_parameter(WIFI_SPI_CLOSE_SOCKET, &temp_packets, OTHER_TIME_OUT); +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 软复位 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 // 使用示例 // 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_close_sleep_model (void) +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_reset (void) { - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+SLEEP=0\r\n"); - // 设置模块工作模式 - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 断开与wifi的连接 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_disconnected_wifi(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_disconnected_wifi (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CWQAP\r\n"); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 进入打开透传模式 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_entry_serianet(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_entry_serianet (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPSEND\r\n"); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 退出透传模式 -// 参数说明 model 0:关闭透传模式 其他:开启透传模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_exit_serianet(1); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_exit_serianet (void) -{ - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - system_delay_ms(20); - wifi_spi_send_command("+++"); - system_delay_ms(1000); - - return 0; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 建立TCP连接 -// 参数说明 ip 远端 IPv4 地址、IPv6 地址,或域名 -// 参数说明 port 远端端口值 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_connect_tcp_servers("192.168.101.110", "8080"); -// 备注信息 如果总是连接不上电脑的TCP服务器 可以尝试使用网线连接电脑 -// 如果是使用WiFi连接 可能会导致模块连接TCP服务器等待较长时间 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_connect_tcp_servers (char *ip, char *port, wifi_spi_transfer_mode_enum mode) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + uint8 return_state; + wifi_spi_head_struct head; + return_state = 1; do { - if(wifi_spi_set_connect_model("0")) + head.command = WIFI_SPI_RESET; + head.length = 0xA5A5; + return_state = wifi_spi_wait_idle(OTHER_TIME_OUT); + if(return_state) { - return_state = 1; break; } + wifi_spi_write(&head.command, sizeof(wifi_spi_head_struct), NULL, 0); + }while(0); + + return return_state; +} - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPSTARTEX=\"TCP\",\"%s\",%s\r\n", ip, port); - wifi_spi_send_command(temp); - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI UDP模式时立即发送函数 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 在UDP模式下模块收到数据后会等待2毫秒,2毫秒后未收到数据则将数据通过socket发送到网络,如果希望立即发送则在数据传输完毕后调用此函数 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_udp_send_now (void) +{ + uint8 return_state = 1; + wifi_spi_packets_struct temp_packets; + + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + do { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - // 设置传输模式 - if(wifi_spi_set_transfer_model(WIFI_SPI_COMMAND == mode ? "0" : "1")) - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPSTATE?\r\n"); - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - else - { - uint8 receiver_buffer[128]; - uint32 receiver_len = 128; - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - char* buffer_index = (char *)receiver_buffer; - char* end_index; - - buffer_index += 22; - buffer_index += strlen(ip); - buffer_index += strlen(port); - end_index = strchr(buffer_index, ','); - - memcpy(wifi_spi_information.local_port, " ", 7); - memcpy(wifi_spi_information.local_port, buffer_index, (end_index - buffer_index)); - } - - wifi_spi_information.connect_state = WIFI_SPI_SERVER_ON; - wifi_spi_information.connect_mode = WIFI_SPI_TCP_CLIENT; - wifi_spi_information.transfer_mode = mode; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SERIANET == mode) // 透传模式下直接开启透传 - { - if(wifi_spi_entry_serianet()) + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) { - return_state = 1; break; } - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 建立UDP连接 -// 参数说明 *ip 远端 IPv4 地址、IPv6 地址 或域名 字符串形式 -// 参数说明 *port 远端端口值 字符串形式 -// 参数说明 *local_port 远端 IPv4 地址、IPv6 地址 或域名 字符串形式 -// 参数说明 mode 模块数据通信模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_connect_udp_client("192.168.101.110", "8080", "8080", WIFI_SPI_COMMAND); -// 备注信息 自动分配ID -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_connect_udp_client (char *ip, char *port, char *local_port, wifi_spi_transfer_mode_enum mode) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - do - { - if(wifi_spi_set_connect_model("0")) - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + // 立即开始socket发送 + temp_packets.head.command = WIFI_SPI_UDP_SEND; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + + // 等待应答信号 + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + + // 接收应答信号 + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, temp_packets.head.length); + + if(WIFI_SPI_REPLY_OK == temp_packets.head.command) + { + return_state = 0; + } + + }while(0); - sprintf(temp, "AT+CIPSTARTEX=\"UDP\",\"%s\",%s,%s\r\n", ip, port, local_port); - wifi_spi_send_command(temp); + // 将通讯状态设置为空闲 + wifi_spi_mutex = WIFI_SPI_IDLE; + } + + return return_state; +} - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 数据块发送函数并同步接收数据 +// 参数说明 *buff 需要发送的数据地址 +// 参数说明 length 发送长度 +// 返回参数 uint32 剩余未发送的长度 +// 使用示例 wifi_spi_send_buffer(buffer, 100); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +uint32 wifi_spi_send_buffer (const uint8 *buffer, uint32 length) +{ + uint16 send_length; + wifi_spi_packets_struct temp_packets; + + // 检查WIFI SPI状态,如果在其他中断或者线程中已经发起了通讯,则本次不能发送数据 + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + + while(length) { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_spi_set_transfer_model(WIFI_SPI_COMMAND == mode ? "0" : "1")) // 设置传输模式 - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SERIANET == mode) // 透传模式下直接开启透传 - { - if(wifi_spi_entry_serianet()) + send_length = length > WIFI_SPI_TRANSFER_SIZE ? (uint16)WIFI_SPI_TRANSFER_SIZE : (uint16)length; + + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) { - return_state = 1; break; } - } - memcpy(wifi_spi_information.local_port, " ", 7); - memcpy(wifi_spi_information.local_port, local_port, strlen(local_port)); - wifi_spi_information.connect_state = WIFI_SPI_SERVER_ON; - wifi_spi_information.connect_mode = WIFI_SPI_UDP_CLIENT; - wifi_spi_information.transfer_mode = mode; - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 断开连接 TCP Server 使用本接口将会断开所有连接 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_disconnect_link(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_disconnect_link (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - do - { - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - wifi_spi_send_command("AT+CIPCLOSE=5\r\n"); - } - else - { - wifi_spi_send_command("AT+CIPCLOSE\r\n"); - } - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送字节函数 -// 参数说明 data 需要发送的数据 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_byte(0xa5); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_byte (uint8 data) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - send_length = 1; - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data(&data, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else - { - send_length = (uint16)wifi_spi_write_data(&data, send_length); - } - } - } - - return send_length; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送缓冲区函数 -// 参数说明 buff 需要发送的数据地址 -// 参数说明 len 发送长度 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_buffer("123", 3); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 len) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - while(len) - { - if((WIFI_SPI_WRITE_MAX * 2) < len) send_length = WIFI_SPI_WRITE_MAX * 2; - else - { - send_length = (uint16)len; - } - len -= send_length; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data(buff, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } - buff += send_length; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else - { - len = wifi_spi_write_data(buff, len); - } - } - } - - return len; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送缓冲区函数(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 -// 备注信息 需要发送多个数组时,采用此函数可以极大的降低通讯时间,发送数据总长度不能超过4092 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_buffer_multi (wifi_spi_send_multi_struct *multi_buffer) -{ - uint8 i; - uint16 remain_length; - - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - for(i = 0; i < WIFI_SPI_MAX_MULTI; i++) - { - if(multi_buffer->source[i]) wifi_spi_send_buffer(multi_buffer->source[i], multi_buffer->length[i]); - } - } - else - { - remain_length = (uint16)wifi_spi_write_data_multi(multi_buffer); - } - } - } - - return remain_length; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送字符串函数 -// 参数说明 *str 需要发送的数据 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_string("123"); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_string (const char *str) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - send_length = (uint16)strlen(str); - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data((uint8 *)str, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } + wifi_spi_transfer_data(buffer, &temp_packets, send_length); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) { - send_length = (uint16)wifi_spi_write_data((uint8 *)str, send_length); + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + + length -= send_length; + buffer += send_length; + } + + // 检查最后一次的接收是否将所有的数据都接收完毕 + while(WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) + { + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + + // 继续读取模块剩余数据 + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } } } + wifi_spi_mutex = WIFI_SPI_IDLE; } - - return send_length; + return length; } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi 模块数据接收函数 -// 参数说明 buffer 接收数据的存放地址 -// 参数说明 len 数组长度,可直接填写或者使用sizeof求得 -// 返回参数 uint32 返回实际接收到的数据长度 -// 使用示例 uint8 test_buffer[256]; wifi_spi_read_buffer(&test_buffer[0], sizeof(test_buffer)); +// 函数简介 WIFI SPI 读取缓冲区 +// 参数说明 *buff 接收缓冲区 +// 参数说明 length 读取数据长度 +// 返回参数 uint32 实际读取数据长度 +// 使用示例 wifi_spi_read_buffer(buffer, 100); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 len) +uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 length) { - fifo_read_buffer(&wifi_spi_fifo, buffer, &len, FIFO_READ_AND_CLEAN); - return len; + zf_assert(NULL != buffer); + uint32 data_len = length; + +#if(1 == WIFI_SPI_READ_TRANSFER) + + wifi_spi_packets_struct temp_packets; + // 检查WIFI SPI状态,如果在其他中断或者线程中已经发起了通讯,则本次不能发送数据 + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + + // 发起通讯查看模块内是否有数据未读取 + do + { + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + }while(WIFI_SPI_REPLY_DATA_START == temp_packets.head.command); + wifi_spi_mutex = WIFI_SPI_IDLE; + } +#endif + + fifo_read_buffer(&wifi_spi_fifo, buffer, &data_len, FIFO_READ_AND_CLEAN); + return data_len; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 wifi spi handshake中断回调函数 -// 参数说明 void -// 返回参数 void -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -void wifi_spi_callback (void) -{ - wifi_spi_check_state_read_buffer(); - wifi_spi_ack_flag = 1; // ACK标志位置1 -} - - //------------------------------------------------------------------------------------------------------------------- // 函数简介 WiFi 模块初始化 // 参数说明 *wifi_ssid 目标连接的 WiFi 的名称 字符串形式 // 参数说明 *pass_word 目标连接的 WiFi 的密码 字符串形式 -// 参数说明 wifi_mode 模块的工作模式 参照 zf_device_wireless_spi.h 中 wifi_spi_mode_enum 枚举 // 返回参数 uint8 模块初始化状态 0-成功 1-错误 -// 使用示例 wifi_spi_init("SEEKFREE_2.4G", "SEEKFREEV2", WIFI_UART_STATION); -// 备注信息 初始化会首先设置串口配置,之后会对模块进行基本参数配置 -// 具体的配置信息可以在 zf_device_wireless_spi.h 文件中修改 +// 使用示例 wifi_spi_init("SEEKFREE", "SEEKFREE123"); +// 备注信息 wifi_spi_init("SEEKFREE", NULL); // 连接没有密码的WIFI热点 //------------------------------------------------------------------------------------------------------------------- -uint8 wifi_spi_init (char *wifi_ssid, char *pass_word, wifi_spi_mode_enum wifi_mode) +uint8 wifi_spi_init (char *wifi_ssid, char *pass_word) { uint8 return_state = 0; - uint32 temp_isr; - - spi_init(WIFI_SPI_INDEX, SPI_MODE0, WIFI_SPI_SPEED, WIFI_SPI_SCK_PIN, WIFI_SPI_MOSI_PIN, WIFI_SPI_MISO_PIN, SPI_CS_NULL);//硬件SPI初始化 - set_wireless_type(WIFI_SPI, wifi_spi_callback); - fifo_init(&wifi_spi_fifo, FIFO_DATA_8BIT, wifi_spi_buffer, WIFI_SPI_BUFFER_SIZE); + fifo_init(&wifi_spi_fifo, FIFO_DATA_8BIT, wifi_spi_buffer, WIFI_SPI_RECVIVE_FIFO_SIZE); + spi_init(WIFI_SPI_INDEX, SPI_MODE3, WIFI_SPI_SPEED, WIFI_SPI_SCK_PIN, WIFI_SPI_MOSI_PIN, WIFI_SPI_MISO_PIN, SPI_CS_NULL);//硬件SPI初始化 gpio_init(WIFI_SPI_CS_PIN, GPO, 1, GPO_PUSH_PULL); gpio_init(WIFI_SPI_RST_PIN, GPO, 1, GPO_PUSH_PULL); - - temp_isr = interrupt_global_disable(); - - exti_init(WIFI_SPI_INT_PIN, EXTI_TRIGGER_RISING); - + gpio_init(WIFI_SPI_INT_PIN, GPI, 0, GPI_PULL_DOWN); + + // 复位 gpio_set_level(WIFI_SPI_RST_PIN, 0); - system_delay_ms(50); + system_delay_ms(10); gpio_set_level(WIFI_SPI_RST_PIN, 1); - system_delay_ms(1000); + + // 等待模块初始化 + system_delay_ms(100); + wifi_spi_mutex = WIFI_SPI_IDLE; - exti_flag_clear(WIFI_SPI_INT_PIN); - - interrupt_global_enable(temp_isr); do { - if(wifi_spi_echo_set("0")) // 关闭模块回写 + // 固件版本信息以字符串形式保存在wifi_spi_version数组中 + return_state = wifi_spi_get_version(); + if(return_state) + { + break; + } + + // MAC地址信息以字符串形式保存在wifi_spi_mac_addr数组中 + wifi_spi_get_mac_addr(); + + + return_state = wifi_spi_wifi_connect(wifi_ssid, pass_word); + if(return_state) { - zf_log(0, "exit echo failed"); - return_state = 1; break; } - if(wifi_spi_auto_connect_wifi("0")) // 关闭自动连接 + #if(1 == WIFI_SPI_AUTO_CONNECT) + return_state = wifi_spi_socket_connect("TCP", WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT); + if(return_state) { - zf_log(0, "close auto connect failed"); - return_state = 1; break; } - - if(wifi_spi_set_model(wifi_mode)) // 设置运行模式 + #endif + + #if(2 == WIFI_SPI_AUTO_CONNECT) + return_state = wifi_spi_socket_connect("UDP", WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT); + if(return_state) { - zf_log(0, "set run mode failed"); - return_state = 1; break; } - - if(wifi_spi_close_sleep_model()) // 关闭睡眠模式 - { - zf_log(0, "set sleep mode failed"); - return_state = 1; - break; - } - - if(wifi_spi_set_wifi((char *)wifi_ssid, (char *)pass_word)) // 连接 wifi 或者开启热点 - { - zf_log(0, "wifi set failed"); - return_state = 1; - break; - } - - if(wifi_spi_get_information()) // 模块基本参数获取 - { - zf_log(0, "get module information failed"); - return_state = 1; - break; - } -#if WIFI_SPI_AUTO_CONNECT == 1 - if(wifi_spi_connect_tcp_servers(WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_SERIANET)) // 连接TCP服务器 - { - zf_log(0, "connect TCP server failed"); - return_state = 1; - break; - } -#endif -#if WIFI_SPI_AUTO_CONNECT == 2 - if(wifi_spi_connect_udp_client(WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT, WIFI_SPI_SERIANET)) // 建立UDP连接 - { - zf_log(0, "connect UDP server failed"); - return_state = 1; - break; - } -#endif - // 模块初始化成功 - wifi_spi_init_flag = 1; + #endif }while(0); - + return return_state; } diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_wifi_spi.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_wifi_spi.h index 5e5a025..24e7eb1 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_wifi_spi.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_wifi_spi.h @@ -24,13 +24,13 @@ * 文件名称 zf_device_wifi_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 * 日期 作者 备注 -* 2023-05-27 pudding first version +* 2024-01-18 SeekFree first version ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,128 +53,100 @@ #include "zf_common_typedef.h" + #define WIFI_SPI_INDEX (SPI_3 ) // 定义使用的SPI号 -#define WIFI_SPI_SPEED (30 * 1000 * 1000 ) // 硬件 SPI 速率 +#define WIFI_SPI_SPEED (50 * 1000 * 1000 ) // 硬件 SPI 速率 #define WIFI_SPI_SCK_PIN (SPI3_SCLK_P22_3 ) // 定义SPI_SCK引脚 #define WIFI_SPI_MOSI_PIN (SPI3_MOSI_P22_0 ) // 定义SPI_MOSI引脚 #define WIFI_SPI_MISO_PIN (SPI3_MISO_P22_1 ) // 定义SPI_MISO引脚 IPS没有MISO引脚,但是这里任然需要定义,在spi的初始化时需要使用 #define WIFI_SPI_CS_PIN (P22_2 ) // 定义SPI_CS引脚 采用软件CS引脚 -#define WIFI_SPI_INT_PIN (ERU_CH5_REQ1_P15_8) // 定义中断引脚 +#define WIFI_SPI_INT_PIN (P15_8 ) // 定义握手引脚 #define WIFI_SPI_RST_PIN (P23_1 ) // 定义复位引脚 - - -#define WIFI_SPI_BUFFER_SIZE (1024) // 定义SPI接收的缓冲区大小 -#define WIFI_SPI_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不连接 1-自动连接TCP服务器并进入透传模式 2-自动连接UDP服务器并进入透传模式 3:自动建立TCP服务器 - -#if (WIFI_SPI_AUTO_CONNECT > 2) + +#define WIFI_SPI_RECVIVE_FIFO_SIZE (1024) // 接收FIFO大小 +#define WIFI_SPI_READ_TRANSFER (1) // 在调用wifi_spi_read_buffer 是否尝试发起SPI通讯来检测模块内是否有数据需要读取 1:发起SPI通讯 0:不发起SPI通讯,仅读取FIFO + // 如果应用程序中没有任何的地方调用发送函数,则WIFI_SPI_READ_TRANSFER必须设置为1 + +#define WIFI_SPI_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不自动连接 1-自动连接TCP服务器 2-自动连接UDP + +#if (WIFI_SPI_AUTO_CONNECT > 2) #error "WIFI_SPI_AUTO_CONNECT 的值只能为 [0,1,2]" #else -#define WIFI_SPI_TARGET_IP "192.168.2.28" // 连接目标的 IP +#define WIFI_SPI_TARGET_IP "192.168.137.1" // 连接目标的 IP #define WIFI_SPI_TARGET_PORT "8080" // 连接目标的端口 -#define WIFI_SPI_LOCAL_PORT "8080" // 本机端口 +#define WIFI_SPI_LOCAL_PORT "6666" // 本机的端口 0:随机 可设置范围2048-65535 默认 6666 #endif -#define WIFI_SPI_MAX_MULTI (17) // 多地址发送,最大8个地址 -typedef enum -{ - BUFFER_IDLE, // 模块的缓冲区是空闲的 - BUFFER_READ, // 模块的缓冲区有数据需要读取 - BUFFER_WRITE, // 模块的缓冲区是可写的 -}wifi_spi_buffer_state_enum; +#define WIFI_SPI_RECVIVE_SIZE (32) // 每次SPI传输接收的字节数 不允许修改 +#define WIFI_SPI_TRANSFER_SIZE (4088) // 最大SPI传输接收的字节数 不允许修改 + + typedef enum -{ - TRANSMIT_IDLE, // 当前没有传输 - TRANSMIT_WRITE_REQUEST, // 给模块发送了一个传输请求 - TRANSMIT_READ_STATE, // 读取模块状态 - TRANSMIT_READ, // 正在读取模块内部数据 - TRANSMIT_WRITE, // 正在往模块写入数据 -}wifi_spi_transmit_state_enum; - -typedef enum -{ - WIFI_SPI_STATION, // 设备模式 - WIFI_SPI_SOFTAP, // AP模式 -}wifi_spi_mode_enum; - -typedef enum -{ - WIFI_SPI_COMMAND, // 使用命令的方式发送数据 - WIFI_SPI_SERIANET, // 使用透传的方式发送数据 -}wifi_spi_transfer_mode_enum; - -typedef enum -{ - WIFI_SPI_TCP_CLIENT, // 模块连接TCP服务器 - WIFI_SPI_TCP_SERVER, // 模块作为TCP服务器 - WIFI_SPI_UDP_CLIENT, // 模块启用UDP连接 -}wifi_spi_connect_mode_enum; - -typedef enum -{ - WIFI_SPI_SERVER_OFF, // 模块未连接服务器 - WIFI_SPI_SERVER_ON, // 模块已经连接服务器 -}wifi_spi_connect_state_enum; - -typedef enum -{ - WIFI_SPI_LINK_0, // 模块当前链接 0 - WIFI_SPI_LINK_1, // 模块当前链接 1 - WIFI_SPI_LINK_2, // 模块当前链接 2 - WIFI_SPI_LINK_3, // 模块当前链接 3 - WIFI_SPI_LINK_4, // 模块当前链接 4 -}wifi_spi_link_id_enum; - -typedef struct { - uint8 reserve; - uint8 cmd; - uint8 addr; - uint8 dummy; - uint8 magic; - uint8 sequence; - uint16 length; -}wifi_spi_buffer_struct; + // 主机发送的命令 + WIFI_SPI_INVALID1 = 0x00, // 无效数据包 + WIFI_SPI_RESET = 0x01, // 复位命令 + WIFI_SPI_DATA = 0x02, // 透传数据包 + WIFI_SPI_UDP_SEND = 0x03, // UDP下立即发送命令,默认SPI接收数据后2MS未收到数据自动发送数据 + WIFI_SPI_CLOSE_SOCKET = 0x04, // 断开连接 + + WIFI_SPI_SET_WIFI_INFORMATION = 0x10, // 设置WIFI信息命令 + WIFI_SPI_SET_SOCKET_INFORMATION = 0x11, // 设置SOCKET信息命令 + + WIFI_SPI_GET_VERSION = 0x20, // 获取模块版本 + WIFI_SPI_GET_MAC_ADDR = 0x21, // 获取模块MAC地址 + WIFI_SPI_GET_IP_ADDR = 0x22, // 获取模块IP地址 + + // 从机回传的命令 + WIFI_SPI_REPLY_OK = 0x80, // 从机应答的正确命令 + WIFI_SPI_REPLY_ERROR = 0x81, // 从机应答的错误命令 + + WIFI_SPI_REPLY_DATA_START = 0x90, // 从机回传的数据包,并且还有数据需要主机读取 + WIFI_SPI_REPLY_DATA_END = 0x91, // 从机回传的数据包,数据已读取完毕 + + WIFI_SPI_REPLY_VERSION = 0xA0, // 从机回复固件版本 + WIFI_SPI_REPLY_MAC_ADDR = 0xA1, // 从机回复本机MAC地址等信息 + WIFI_SPI_REPLY_IP_ADDR = 0xA2, // 从机回复本机IP地址、端口号 + WIFI_SPI_INVALID2 = 0xFF // 无效数据包 +}wifi_spi_packets_command_enum; + +typedef enum +{ + WIFI_SPI_IDLE, // 模块空闲,可以进行SPI通讯 + WIFI_SPI_BUSY, // 模块正忙,不可进行SPI通讯 +}wifi_spi_state_enum; + + +typedef struct +{ + uint8 command; // 命令字 + uint8 reserve; // 保留 + uint16 length; // 包有效长度 +}wifi_spi_head_struct; + + +typedef struct +{ + wifi_spi_head_struct head; // 帧头 + uint8 buffer[WIFI_SPI_RECVIVE_SIZE]; // 缓冲区 +}wifi_spi_packets_struct; + + +extern char wifi_spi_version[12]; // 固件版本 字符串 +extern char wifi_spi_mac_addr[20]; // 模块MAC地址 字符串 +extern char wifi_spi_ip_addr_port[25]; // IP地址与端口号 字符串 -typedef struct -{ - uint8 version[12]; // 固件版本 字符串形式 - uint8 mac[20]; // 本机 MAC 地址 字符串形式 - uint8 local_ip[17]; // 本机 IP 地址 字符串形式 - uint8 local_port[10]; // 本机端口号 字符串形式 - uint8 remote_ip[5][17]; // 远端 IP 地址 字符串形式 - wifi_spi_mode_enum mode; // WIFI 模式 - wifi_spi_transfer_mode_enum transfer_mode; // 当前传输模式 - wifi_spi_connect_mode_enum connect_mode; // 网络连接模式 - wifi_spi_connect_state_enum connect_state; // 服务器连接情况 -}wifi_spi_information_struct; +uint8 wifi_spi_wifi_connect (char *wifi_ssid, char *pass_word); +uint8 wifi_spi_socket_connect (char *transport_type, char *ip_addr, char *port, char *local_port); +uint8 wifi_spi_socket_disconnect (void); +uint8 wifi_spi_udp_send_now (void); +uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 length); +uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 length); -typedef struct -{ - uint8 *source[WIFI_SPI_MAX_MULTI]; - uint16 length[WIFI_SPI_MAX_MULTI]; -}wifi_spi_send_multi_struct; - -extern wifi_spi_information_struct wifi_spi_information; - - -uint8 wifi_spi_disconnected_wifi (void); // 断开 WIFI 连接 -uint8 wifi_spi_entry_serianet (void); // 打开透传模式 -uint8 wifi_spi_exit_serianet (void); // 关闭透传模式 - -uint8 wifi_spi_connect_tcp_servers (char *ip, char *port, wifi_spi_transfer_mode_enum mode); // 建立 TCP 连接 -uint8 wifi_spi_connect_udp_client (char *ip, char *port, char *local_port, wifi_spi_transfer_mode_enum mode); // 建立 UDP 传输 -uint8 wifi_spi_disconnect_link (void); // 断开连接 TCP Server 使用本接口将会断开所有连接 - -uint32 wifi_spi_send_byte (uint8 data); // WIFI 模块发送字节函数 -uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 length); // WIFI 模块发送缓冲区函数 -uint32 wifi_spi_send_buffer_multi (wifi_spi_send_multi_struct *multi_buffer); // WIFI 模块发送多缓冲区函数 -uint32 wifi_spi_send_string (const char *str); // WIFI 模块发送字符串函数 - -uint32 wifi_spi_read_buffer (uint8 *buff, uint32 len); // WIFI 模块数据接收函数 - -uint8 wifi_spi_init (char *wifi_ssid, char *pass_word, wifi_spi_mode_enum wifi_mode); // WIFI 模块初始化函数 +uint8 wifi_spi_init (char *wifi_ssid, char *pass_word); #endif + diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_wifi_uart.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_wifi_uart.c index 312dab7..ff728bb 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_wifi_uart.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_wifi_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_wifi_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -61,7 +61,7 @@ wifi_uart_information_struct wifi_uart_information; // 模块自身参数 -static fifo_obj_struct wifi_uart_fifo; +static fifo_struct wifi_uart_fifo; static uint8 wifi_uart_buffer[WIFI_UART_BUFFER_SIZE]; // 数据存放数组 static uint8 wifi_uart_data; diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_wifi_uart.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_wifi_uart.h index abcb253..3316b6f 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_wifi_uart.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_wifi_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_wifi_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_wireless_uart.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_wireless_uart.c index eac2867..91ec013 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_wireless_uart.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_wireless_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_wireless_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -53,7 +53,7 @@ #include "zf_device_type.h" #include "zf_device_wireless_uart.h" -static fifo_obj_struct wireless_uart_fifo; +static fifo_struct wireless_uart_fifo; static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; static uint8 wireless_uart_data = 0; diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_wireless_uart.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_wireless_uart.h index 2418545..a789ad0 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_wireless_uart.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_wireless_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_wireless_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -61,11 +61,11 @@ // 注意事项2:开启自动波特率务必连接RTS引脚 否则会开启失败。 // 注意事项3:模块自动波特率失败的话 可以尝试断电重启 -// 开启自动波特率务必阅读上面两条 注意事项 -// 开启自动波特率务必阅读上面两条 注意事项 -// 开启自动波特率务必阅读上面两条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 -// 0:关闭自动波特率 +// 0:关闭自动波特率 // 1:开启自动波特率 自动波特率的作用是修改 WIRELESS_UART_BAUD 之后不需要对模块进行配置 模块会自动设置为对应的波特率 #define WIRELESS_UART_AUTO_BAUD_RATE ( 1 ) diff --git a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_adc.c b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_adc.c index 9a262a1..06694d8 100644 --- a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_adc.c +++ b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_adc.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_adc * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_adc.h b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_adc.h index 378b67e..f017c76 100644 --- a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_adc.h +++ b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_adc.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_adc * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_delay.c b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_delay.c index 4ec533c..ae3e610 100644 --- a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_delay.c +++ b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_delay.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_delay * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_delay.h b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_delay.h index e8d82ef..7b8b475 100644 --- a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_delay.h +++ b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_delay.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_delay * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_dma.c b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_dma.c index f72f1d6..43bffbc 100644 --- a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_dma.c +++ b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_dma.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_dma * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_dma.h b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_dma.h index 1ec555b..320d40c 100644 --- a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_dma.h +++ b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_dma.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_dma * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_encoder.c b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_encoder.c index 6592198..0e0e0b9 100644 --- a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_encoder.c +++ b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_encoder.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_encoder.h b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_encoder.h index 68d159f..e079122 100644 --- a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_encoder.h +++ b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_encoder.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_exti.c b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_exti.c index 72c9a1f..31d270a 100644 --- a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_exti.c +++ b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_exti.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_exti * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_exti.h b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_exti.h index 30f5ef6..b63f9ee 100644 --- a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_exti.h +++ b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_exti.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_exti * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_flash.c b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_flash.c index f91f5a0..325cfed 100644 --- a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_flash.c +++ b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_flash.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_flash * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_flash.h b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_flash.h index 912585a..e7425fd 100644 --- a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_flash.h +++ b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_flash.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_flash * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_gpio.c b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_gpio.c index 5071114..a084353 100644 --- a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_gpio.c +++ b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_gpio.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_gpio * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_gpio.h b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_gpio.h index 2b23be0..550fb8d 100644 --- a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_gpio.h +++ b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_gpio.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_gpio * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_pit.c b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_pit.c index c4dc50d..5e03d38 100644 --- a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_pit.c +++ b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_pit.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pit * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_pit.h b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_pit.h index 5461e05..66854b5 100644 --- a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_pit.h +++ b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_pit.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pit * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_pwm.c b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_pwm.c index ad1059a..24d8d7a 100644 --- a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_pwm.c +++ b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_pwm.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pwm * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_pwm.h b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_pwm.h index d6dce78..51948a4 100644 --- a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_pwm.h +++ b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_pwm.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pwm * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_soft_iic.c b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_soft_iic.c index 9833b62..a349ec7 100644 --- a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_soft_iic.c +++ b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_soft_iic.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_iic * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_soft_iic.h b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_soft_iic.h index a62b262..80db53b 100644 --- a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_soft_iic.h +++ b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_soft_iic.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_iic * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_soft_spi.c b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_soft_spi.c index 292c60b..954fbe3 100644 --- a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_soft_spi.c +++ b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_soft_spi.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_soft_spi.h b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_soft_spi.h index 6a9c207..62858de 100644 --- a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_soft_spi.h +++ b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_soft_spi.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_spi.c b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_spi.c index 1b99196..f817dd9 100644 --- a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_spi.c +++ b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_spi.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -920,7 +920,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 do { - IfxQspi_writeTransmitFifo(moudle, (uint8)(*write_buffer & 0xFF00) >> 8); // 将发送的数据写入缓冲区 + IfxQspi_writeTransmitFifo(moudle, (uint8)((*write_buffer & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 if(read_buffer != NULL) { diff --git a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_spi.h b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_spi.h index e73507e..d15589c 100644 --- a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_spi.h +++ b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_spi.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_timer.c b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_timer.c index a953b92..e085d6e 100644 --- a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_timer.c +++ b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_timer.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_timer * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_timer.h b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_timer.h index 3c86f58..1bb348f 100644 --- a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_timer.h +++ b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_timer.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_timer * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_uart.c b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_uart.c index cd19782..fb89b55 100644 --- a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_uart.c +++ b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_uart.h b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_uart.h index 8d1d111..cdc55ab 100644 --- a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_uart.h +++ b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E08_eeprom_demo/user/isr.c b/Example/E08_eeprom_demo/user/isr.c index 8148b75..b010e82 100644 --- a/Example/E08_eeprom_demo/user/isr.c +++ b/Example/E08_eeprom_demo/user/isr.c @@ -24,7 +24,7 @@ * 文件名称 isr * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -118,7 +118,7 @@ IFX_INTERRUPT(exti_ch1_ch5_isr, 0, EXTI_CH1_CH5_INT_PRIO) { exti_flag_clear(ERU_CH5_REQ1_P15_8); - wireless_module_spi_handler(); // SPI WIFI 中断回调函数 + } } diff --git a/Example/E09_timer_demo/libraries/doc/version.txt b/Example/E09_timer_demo/libraries/doc/version.txt index b841b50..d644136 100644 --- a/Example/E09_timer_demo/libraries/doc/version.txt +++ b/Example/E09_timer_demo/libraries/doc/version.txt @@ -1,3 +1,8 @@ +V3.2.6 + 更新逐飞助手接口函数 调用初始化时直接传参通信类 + 更新wifi SPI驱动文件 提高通信效率 + 更新GPS驱动文件,更名为GNSS,兼容普通定位模块及RTK + V3.2.5 修复延时函数初始化参数及中断向量表问题 V3.2.4 diff --git a/Example/E09_timer_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h b/Example/E09_timer_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h index 28ff689..371e6b6 100644 --- a/Example/E09_timer_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h +++ b/Example/E09_timer_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h @@ -34,7 +34,7 @@ /*------------------------------------------Configuration for IfxScu_cfg.h-------------------------------------------*/ /*********************************************************************************************************************/ /* External oscillator frequency in Hz */ -#define IFX_CFG_SCU_XTAL_FREQUENCY (20000000) /* Allowed values are: 16000000, 20000000 or 40000000 */ +#define IFX_CFG_SCU_XTAL_FREQUENCY (20000000) /* Allowed values are9p: 16000000, 20000000 or 40000000 */ /* PLL frequency in Hz */ #define IFX_CFG_SCU_PLL_FREQUENCY (200000000) /* Allowed values are: 80000000, 133000000, 160000000 * or 200000000 */ diff --git a/Example/E09_timer_demo/libraries/zf_common/zf_common_clock.c b/Example/E09_timer_demo/libraries/zf_common/zf_common_clock.c index 5023270..9872ea9 100644 --- a/Example/E09_timer_demo/libraries/zf_common/zf_common_clock.c +++ b/Example/E09_timer_demo/libraries/zf_common/zf_common_clock.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_clock * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_common/zf_common_clock.h b/Example/E09_timer_demo/libraries/zf_common/zf_common_clock.h index 9face65..2b50396 100644 --- a/Example/E09_timer_demo/libraries/zf_common/zf_common_clock.h +++ b/Example/E09_timer_demo/libraries/zf_common/zf_common_clock.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_clock * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_common/zf_common_debug.c b/Example/E09_timer_demo/libraries/zf_common/zf_common_debug.c index 52c623d..d680265 100644 --- a/Example/E09_timer_demo/libraries/zf_common/zf_common_debug.c +++ b/Example/E09_timer_demo/libraries/zf_common/zf_common_debug.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_debug * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -46,7 +46,7 @@ static volatile uint8 zf_debug_assert_enable = 1; #if DEBUG_UART_USE_INTERRUPT // 如果启用 debug uart 接收中断 uint8 debug_uart_buffer[DEBUG_RING_BUFFER_LEN]; // 数据存放数组 uint8 debug_uart_data; -fifo_obj_struct debug_uart_fifo; +fifo_struct debug_uart_fifo; #endif //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E09_timer_demo/libraries/zf_common/zf_common_debug.h b/Example/E09_timer_demo/libraries/zf_common/zf_common_debug.h index 881a297..4fb4d91 100644 --- a/Example/E09_timer_demo/libraries/zf_common/zf_common_debug.h +++ b/Example/E09_timer_demo/libraries/zf_common/zf_common_debug.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_debug * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_common/zf_common_fifo.c b/Example/E09_timer_demo/libraries/zf_common/zf_common_fifo.c index b010d3e..94f5133 100644 --- a/Example/E09_timer_demo/libraries/zf_common/zf_common_fifo.c +++ b/Example/E09_timer_demo/libraries/zf_common/zf_common_fifo.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_fifo * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -45,7 +45,7 @@ // 使用示例 fifo_head_offset(fifo, 1); // 备注信息 本函数在文件内部调用 用户不用关注 也不可修改 //------------------------------------------------------------------------------------------------------------------- -static void fifo_head_offset (fifo_obj_struct *fifo, uint32 offset) +static void fifo_head_offset (fifo_struct *fifo, uint32 offset) { fifo->head += offset; @@ -63,7 +63,7 @@ static void fifo_head_offset (fifo_obj_struct *fifo, uint32 offset) // 使用示例 fifo_end_offset(fifo, 1); // 备注信息 本函数在文件内部调用 用户不用关注 也不可修改 //------------------------------------------------------------------------------------------------------------------- -static void fifo_end_offset (fifo_obj_struct *fifo, uint32 offset) +static void fifo_end_offset (fifo_struct *fifo, uint32 offset) { fifo->end += offset; @@ -80,7 +80,7 @@ static void fifo_end_offset (fifo_obj_struct *fifo, uint32 offset) // 使用示例 fifo_clear(fifo); // 备注信息 清空当前 FIFO 对象的内存 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_clear (fifo_obj_struct *fifo) +fifo_state_enum fifo_clear (fifo_struct *fifo) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -113,7 +113,7 @@ fifo_state_enum fifo_clear (fifo_obj_struct *fifo) // 使用示例 uint32 len = fifo_used(fifo); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 fifo_used (fifo_obj_struct *fifo) +uint32 fifo_used (fifo_struct *fifo) { zf_assert(fifo != NULL); return (fifo->max - fifo->size); // 返回当前 FIFO 缓冲区中数据个数 @@ -127,7 +127,7 @@ uint32 fifo_used (fifo_obj_struct *fifo) // 使用示例 zf_log(fifo_write_element(&fifo, data) == FIFO_SUCCESS, "fifo_write_byte error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat) +fifo_state_enum fifo_write_element (fifo_struct *fifo, uint32 dat) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -171,7 +171,7 @@ fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat) // 使用示例 zf_log(fifo_write_buffer(&fifo, data, 32) == FIFO_SUCCESS, "fifo_write_buffer error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 length) +fifo_state_enum fifo_write_buffer (fifo_struct *fifo, void *dat, uint32 length) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -286,7 +286,7 @@ fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 leng // 使用示例 zf_log(fifo_read_element(&fifo, data, FIFO_READ_ONLY) == FIFO_SUCCESS, "fifo_read_byte error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operation_enum flag) +fifo_state_enum fifo_read_element (fifo_struct *fifo, void *dat, fifo_operation_enum flag) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -348,7 +348,7 @@ fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operat // 使用示例 zf_log(fifo_read_buffer(&fifo, data, &length, FIFO_READ_ONLY) == FIFO_SUCCESS, "fifo_read_buffer error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) +fifo_state_enum fifo_read_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) { zf_assert(NULL != fifo); zf_assert(NULL != length); @@ -447,7 +447,7 @@ fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *leng // 如果使用 FIFO_READ_AND_CLEAN 操作 将会丢弃所有数据并清空整个 FIFO // 如果使用 FIFO_READ_AND_CLEAN 操作 将会丢弃所有数据并清空整个 FIFO //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) +fifo_state_enum fifo_read_tail_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) { zf_assert(NULL != fifo); zf_assert(NULL != length); @@ -541,7 +541,7 @@ fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 // 使用示例 fifo_init(&user_fifo, user_buffer, 64); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_init (fifo_obj_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size) +fifo_state_enum fifo_init (fifo_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; diff --git a/Example/E09_timer_demo/libraries/zf_common/zf_common_fifo.h b/Example/E09_timer_demo/libraries/zf_common/zf_common_fifo.h index 5cc7668..901a913 100644 --- a/Example/E09_timer_demo/libraries/zf_common/zf_common_fifo.h +++ b/Example/E09_timer_demo/libraries/zf_common/zf_common_fifo.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_fifo * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -91,17 +91,17 @@ typedef struct uint32 end; // 缓存尾指针 总是指向非空缓存(缓存全空除外) uint32 size; // 缓存剩余大小 uint32 max; // 缓存总大小 -}fifo_obj_struct; +}fifo_struct; -fifo_state_enum fifo_clear (fifo_obj_struct *fifo); -uint32 fifo_used (fifo_obj_struct *fifo); +fifo_state_enum fifo_clear (fifo_struct *fifo); +uint32 fifo_used (fifo_struct *fifo); -fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat); -fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 length); -fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operation_enum flag); -fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); -fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); +fifo_state_enum fifo_write_element (fifo_struct *fifo, uint32 dat); +fifo_state_enum fifo_write_buffer (fifo_struct *fifo, void *dat, uint32 length); +fifo_state_enum fifo_read_element (fifo_struct *fifo, void *dat, fifo_operation_enum flag); +fifo_state_enum fifo_read_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); +fifo_state_enum fifo_read_tail_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); -fifo_state_enum fifo_init (fifo_obj_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size); +fifo_state_enum fifo_init (fifo_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size); #endif diff --git a/Example/E09_timer_demo/libraries/zf_common/zf_common_font.c b/Example/E09_timer_demo/libraries/zf_common/zf_common_font.c index c816f9d..ee1df09 100644 --- a/Example/E09_timer_demo/libraries/zf_common/zf_common_font.c +++ b/Example/E09_timer_demo/libraries/zf_common/zf_common_font.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_font * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_common/zf_common_font.h b/Example/E09_timer_demo/libraries/zf_common/zf_common_font.h index 24b8602..7531250 100644 --- a/Example/E09_timer_demo/libraries/zf_common/zf_common_font.h +++ b/Example/E09_timer_demo/libraries/zf_common/zf_common_font.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_font * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_common/zf_common_function.c b/Example/E09_timer_demo/libraries/zf_common/zf_common_function.c index d403fb5..acf2739 100644 --- a/Example/E09_timer_demo/libraries/zf_common/zf_common_function.c +++ b/Example/E09_timer_demo/libraries/zf_common/zf_common_function.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_function * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_common/zf_common_function.h b/Example/E09_timer_demo/libraries/zf_common/zf_common_function.h index f5683e1..101b58a 100644 --- a/Example/E09_timer_demo/libraries/zf_common/zf_common_function.h +++ b/Example/E09_timer_demo/libraries/zf_common/zf_common_function.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_function * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_common/zf_common_headfile.h b/Example/E09_timer_demo/libraries/zf_common/zf_common_headfile.h index aa06ef8..86762db 100644 --- a/Example/E09_timer_demo/libraries/zf_common/zf_common_headfile.h +++ b/Example/E09_timer_demo/libraries/zf_common/zf_common_headfile.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_headfile * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -82,7 +82,7 @@ //===================================================外接设备驱动层=================================================== #include "zf_device_absolute_encoder.h" #include "zf_device_bluetooth_ch9141.h" -#include "zf_device_gps_tau1201.h" +#include "zf_device_gnss.h" #include "zf_device_camera.h" #include "zf_device_dl1a.h" #include "zf_device_dl1b.h" @@ -108,6 +108,7 @@ //====================================================应用组件层==================================================== #include "seekfree_assistant.h" +#include "seekfree_assistant_interface.h" //====================================================应用组件层==================================================== //=====================================================用户层====================================================== diff --git a/Example/E09_timer_demo/libraries/zf_common/zf_common_interrupt.c b/Example/E09_timer_demo/libraries/zf_common/zf_common_interrupt.c index 61058b2..af12fe0 100644 --- a/Example/E09_timer_demo/libraries/zf_common/zf_common_interrupt.c +++ b/Example/E09_timer_demo/libraries/zf_common/zf_common_interrupt.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_interrupt * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_common/zf_common_interrupt.h b/Example/E09_timer_demo/libraries/zf_common/zf_common_interrupt.h index 99b0e53..f828423 100644 --- a/Example/E09_timer_demo/libraries/zf_common/zf_common_interrupt.h +++ b/Example/E09_timer_demo/libraries/zf_common/zf_common_interrupt.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_interrupt * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_common/zf_common_typedef.h b/Example/E09_timer_demo/libraries/zf_common/zf_common_typedef.h index bd09f30..9a07c92 100644 --- a/Example/E09_timer_demo/libraries/zf_common/zf_common_typedef.h +++ b/Example/E09_timer_demo/libraries/zf_common/zf_common_typedef.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_typedef * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_components/seekfree_assistant.c b/Example/E09_timer_demo/libraries/zf_components/seekfree_assistant.c index a196e10..0b7cb9d 100644 --- a/Example/E09_timer_demo/libraries/zf_components/seekfree_assistant.c +++ b/Example/E09_timer_demo/libraries/zf_components/seekfree_assistant.c @@ -1,49 +1,71 @@ /********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ -#include "zf_common_fifo.h" + +#include "zf_common_debug.h" + #include "seekfree_assistant.h" -seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 -static seekfree_assistant_camera_struct seekfree_assistant_camera_data; // 图像上位机协议数据 -static seekfree_assistant_camera_dot_struct seekfree_assistant_camera_dot_data; // 图像上位机打点协议数据 -static seekfree_assistant_camera_buffer_struct seekfree_assistant_camera_buffer; // 图像以及边界缓冲区信息 -static fifo_obj_struct seekfree_assistant_fifo; -static uint8 seekfree_assistant_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE]; // 数据存放数组 -float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 保存接收到的参数 -vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 参数更新标志位 +extern uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length); +extern uint32 seekfree_assistant_receive (uint8 *buff, uint32 length); + +#if (1 == SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE) +#include "zf_common_fifo.h" +static uint8 seekfree_assistant_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE]; // FIFO缓冲区 +static fifo_struct seekfree_assistant_fifo = // FIFO结构体 +{ + .buffer = seekfree_assistant_buffer, + .execution = FIFO_IDLE, + .type = FIFO_DATA_8BIT, + .head = 0, + .end = 0, + .size = SEEKFREE_ASSISTANT_BUFFER_SIZE, + .max = SEEKFREE_ASSISTANT_BUFFER_SIZE, +}; +#endif + +static seekfree_assistant_camera_struct seekfree_assistant_camera_data; // 图像上位机协议数据 +static seekfree_assistant_camera_dot_struct seekfree_assistant_camera_dot_data; // 图像上位机打点协议数据 +static seekfree_assistant_camera_buffer_struct seekfree_assistant_camera_buffer; // 图像以及边界缓冲区信息 + +seekfree_assistant_transfer_callback_function seekfree_assistant_transfer_callback = seekfree_assistant_transfer; // 数据发送函数指针 +seekfree_assistant_receive_callback_function seekfree_assistant_receive_callback = seekfree_assistant_receive; // 数据接收函数指针 + +seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 +float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 保存接收到的参数 +vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 参数更新标志位 //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手求和函数 @@ -87,7 +109,7 @@ void seekfree_assistant_camera_data_send (seekfree_assistant_image_type_enum cam seekfree_assistant_camera_data.image_height = height; // 首先发送帧头、功能、摄像头类型、以及宽度高度等信息 - seekfree_assistant_transfer((const uint8 *)&seekfree_assistant_camera_data, sizeof(seekfree_assistant_camera_struct)); + seekfree_assistant_transfer_callback((const uint8 *)&seekfree_assistant_camera_data, sizeof(seekfree_assistant_camera_struct)); // 根据摄像头类型计算图像大小 switch(camera_type) @@ -111,9 +133,8 @@ void seekfree_assistant_camera_data_send (seekfree_assistant_image_type_enum cam // 发送图像数据 if(NULL != image_addr) { - seekfree_assistant_transfer(image_addr, image_size); + seekfree_assistant_transfer_callback(image_addr, image_size); } - } //------------------------------------------------------------------------------------------------------------------- @@ -139,16 +160,15 @@ void seekfree_assistant_camera_dot_send (seekfree_assistant_camera_buffer_struct dot_bytes *= 2; } - // 首先发送帧头、功能、边界编号、坐标长度、点个数 - seekfree_assistant_transfer((const uint8 *)&seekfree_assistant_camera_dot_data, sizeof(seekfree_assistant_camera_dot_struct)); + seekfree_assistant_transfer_callback((const uint8 *)&seekfree_assistant_camera_dot_data, sizeof(seekfree_assistant_camera_dot_struct)); for(i=0; i < SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY; i++) { // 判断是否发送横坐标数据 if(NULL != buffer->boundary_x[i]) { - seekfree_assistant_transfer((const uint8 *)buffer->boundary_x[i], dot_bytes); + seekfree_assistant_transfer_callback((const uint8 *)buffer->boundary_x[i], dot_bytes); } // 判断是否发送纵坐标数据 @@ -156,10 +176,9 @@ void seekfree_assistant_camera_dot_send (seekfree_assistant_camera_buffer_struct { // 如果没有纵坐标数据,则表示每一行只有一个边界 // 指定了横纵坐标数据,这种方式可以实现同一行多个边界的情况,例如搜线算法能够搜索出回弯。 - seekfree_assistant_transfer((const uint8 *)buffer->boundary_y[i], dot_bytes); + seekfree_assistant_transfer_callback((const uint8 *)buffer->boundary_y[i], dot_bytes); } } - } //------------------------------------------------------------------------------------------------------------------- @@ -193,7 +212,7 @@ void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struc // 数据在调用本函数之前,由用户将需要发送的数据写入seekfree_assistant_oscilloscope_data.data[] - seekfree_assistant_transfer((const uint8 *)seekfree_assistant_oscilloscope, packet_size); + seekfree_assistant_transfer_callback((const uint8 *)seekfree_assistant_oscilloscope, packet_size); } //------------------------------------------------------------------------------------------------------------------- @@ -364,12 +383,14 @@ void seekfree_assistant_camera_send (void) } } + //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手解析接收到的数据 // 参数说明 void // 返回参数 void // 使用示例 函数只需要放到周期运行的PIT中断或者主循环即可 //------------------------------------------------------------------------------------------------------------------- +#if (1 == SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE) void seekfree_assistant_data_analysis (void) { uint8 temp_sum; @@ -380,14 +401,13 @@ void seekfree_assistant_data_analysis (void) uint32 temp_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE / 4]; // 尝试读取数据, 如果不是自定义的传输方式则从接收回调中读取数据 - read_length = seekfree_assistant_receive((uint8 *)temp_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); + read_length = seekfree_assistant_receive_callback((uint8 *)temp_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); if(read_length) { // 将读取到的数据写入FIFO fifo_write_buffer(&seekfree_assistant_fifo, (uint8 *)temp_buffer, read_length); } - while(sizeof(seekfree_assistant_parameter_struct) <= fifo_used(&seekfree_assistant_fifo)) { read_length = sizeof(seekfree_assistant_parameter_struct); @@ -416,21 +436,11 @@ void seekfree_assistant_data_analysis (void) } } - // 丢弃无需使用的数据 fifo_read_buffer(&seekfree_assistant_fifo, (uint8 *)temp_buffer, &read_length, FIFO_READ_AND_CLEAN); } } - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 逐飞助手 初始化 -// 参数说明 -// 返回参数 void -// 使用示例 -//------------------------------------------------------------------------------------------------------------------- -ZF_WEAK void seekfree_assistant_init () -{ - fifo_init(&seekfree_assistant_fifo, FIFO_DATA_8BIT, seekfree_assistant_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); -} +#endif + diff --git a/Example/E09_timer_demo/libraries/zf_components/seekfree_assistant.h b/Example/E09_timer_demo/libraries/zf_components/seekfree_assistant.h index d02abb1..ae0f67c 100644 --- a/Example/E09_timer_demo/libraries/zf_components/seekfree_assistant.h +++ b/Example/E09_timer_demo/libraries/zf_components/seekfree_assistant.h @@ -1,69 +1,75 @@ -/*/********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +/********************************************************************************************************************* +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ #ifndef _seekfree_assistant_h_ #define _seekfree_assistant_h_ #include "zf_common_typedef.h" -#include "zf_common_debug.h" + + +// 1:使能参数调节的功能 0:关闭参数调节的功能 +#define SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE ( 1 ) + + // 定义接收FIFO大小 -#define SEEKFREE_ASSISTANT_BUFFER_SIZE ( 0x80 ) +#define SEEKFREE_ASSISTANT_BUFFER_SIZE ( 0x80 ) + +// 定义示波器的最大通道数量 +#define SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT ( 0x08 ) + +// 定义参数调试的最大通道数量 +#define SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT ( 0x08 ) + +// 定义图像边线最大数量 +#define SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY ( 0x08 ) + +// 单片机往上位机发送的帧头 +#define SEEKFREE_ASSISTANT_SEND_HEAD ( 0xAA ) + +// 摄像头类 +#define SEEKFREE_ASSISTANT_CAMERA_FUNCTION ( 0x02 ) +#define SEEKFREE_ASSISTANT_CAMERA_DOT_FUNCTION ( 0x03 ) +#define SEEKFREE_ASSISTANT_CAMERA_OSCILLOSCOPE ( 0x10 ) + +// 上位机往单片机发送的帧头 +#define SEEKFREE_ASSISTANT_RECEIVE_HEAD ( 0x55 ) + +// 参数设置类 +#define SEEKFREE_ASSISTANT_RECEIVE_SET_PARAMETER ( 0x20 ) -// 定义示波器的最大通道数量 -#define SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT ( 0x08 ) - -// 定义参数调试的最大通道数量 -#define SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT ( 0x08 ) - -// 定义图像边线最大数量 -#define SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY ( 0x08 ) - -// 单片机往上位机发送的帧头 -#define SEEKFREE_ASSISTANT_SEND_HEAD ( 0xAA ) - -// 摄像头类 -#define SEEKFREE_ASSISTANT_CAMERA_FUNCTION ( 0x02 ) -#define SEEKFREE_ASSISTANT_CAMERA_DOT_FUNCTION ( 0x03 ) -#define SEEKFREE_ASSISTANT_CAMERA_OSCILLOSCOPE ( 0x10 ) - -// 上位机往单片机发送的帧头 -#define SEEKFREE_ASSISTANT_RECEIVE_HEAD ( 0x55 ) - -// 参数设置类 -#define SEEKFREE_ASSISTANT_RECEIVE_SET_PARAMETER ( 0x20 ) // 摄像头类型枚举 typedef enum @@ -91,71 +97,69 @@ typedef enum typedef struct { - uint8 head; // 帧头 - uint8 channel_num; // 高四位为功能字 低四位为通道数量 - uint8 check_sum; // 和校验 - uint8 length; // 包长度 - float data[SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT]; // 通道数据 + uint8 head; // 帧头 + uint8 channel_num; // 高四位为功能字 低四位为通道数量 + uint8 check_sum; // 和校验 + uint8 length; // 包长度 + float data[SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT]; // 通道数据 }seekfree_assistant_oscilloscope_struct; typedef struct { - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 camera_type; // 低四位表示边界数量 第四位表示是否有图像数据 例如0x13:其中3表示一副图像有三条边界(通常是左边界、中线、右边界)、1表示没有图像数据 - uint8 length; // 包长度(仅包含协议部分) - uint16 image_width; // 图像宽度 - uint16 image_height; // 图像高度 -}seekfree_assistant_camera_struct; - - -typedef struct -{ - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 dot_type; // 点类型 BIT5:1:坐标是16位的 0:坐标是8位的 BIT7-BIT6:0:只有X坐标 1:只有Y坐标 2:X和Y坐标都有 BIT3-BIT0:边界数量 - uint8 length; // 包长度(仅包含协议部分) - uint16 dot_num; // 画点数量 - uint8 valid_flag; // 通道标识 - uint8 reserve; // 保留 -}seekfree_assistant_camera_dot_struct; - -typedef struct -{ - void *image_addr; // 摄像头地址 - uint16 width; // 图像宽度 - uint16 height; // 图像高度 - seekfree_assistant_image_type_enum camera_type; // 摄像头类型 - void *boundary_x[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界横坐标数组地址 - void *boundary_y[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界纵坐标数组地址 + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 camera_type; // 低四位表示边界数量 第四位表示是否有图像数据 例如0x13:其中3表示一副图像有三条边界(通常是左边界、中线、右边界)、1表示没有图像数据 + uint8 length; // 包长度(仅包含协议部分) + uint16 image_width; // 图像宽度 + uint16 image_height; // 图像高度 +}seekfree_assistant_camera_struct; + + +typedef struct +{ + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 dot_type; // 点类型 BIT5:1:坐标是16位的 0:坐标是8位的 BIT7-BIT6:0:只有X坐标 1:只有Y坐标 2:X和Y坐标都有 BIT3-BIT0:边界数量 + uint8 length; // 包长度(仅包含协议部分) + uint16 dot_num; // 画点数量 + uint8 valid_flag; // 通道标识 + uint8 reserve; // 保留 +}seekfree_assistant_camera_dot_struct; + +typedef struct +{ + void *image_addr; // 摄像头地址 + uint16 width; // 图像宽度 + uint16 height; // 图像高度 + seekfree_assistant_image_type_enum camera_type; // 摄像头类型 + void *boundary_x[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界横坐标数组地址 + void *boundary_y[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界纵坐标数组地址 }seekfree_assistant_camera_buffer_struct; typedef struct { - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 channel; // 通道 - uint8 check_sum; // 和校验 - float data; // 数据 + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 channel; // 通道 + uint8 check_sum; // 和校验 + float data; // 数据 }seekfree_assistant_parameter_struct; +typedef uint32 (*seekfree_assistant_transfer_callback_function) (const uint8 *buff, uint32 length); +typedef uint32 (*seekfree_assistant_receive_callback_function) (uint8 *buff, uint32 length); -extern seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 -extern float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 保存接收到的参数 -extern vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 参数更新标志位 +extern seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 +extern float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 保存接收到的参数 +extern vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 参数更新标志位 + + +void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struct *seekfree_assistant_oscilloscope); +void seekfree_assistant_camera_information_config (seekfree_assistant_image_type_enum camera_type, void *image_addr, uint16 width, uint16 height); +void seekfree_assistant_camera_boundary_config (seekfree_assistant_boundary_type_enum boundary_type, uint16 dot_num, void *dot_x1, void *dot_x2, void *dot_x3, void *dot_y1, void *dot_y2, void *dot_y3); +void seekfree_assistant_camera_send (void); +void seekfree_assistant_data_analysis (void); -uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length); -uint32 seekfree_assistant_receive (uint8 *buff, uint32 length); - -void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struct *seekfree_assistant_oscilloscope); - -void seekfree_assistant_camera_information_config (seekfree_assistant_image_type_enum camera_type, void *image_addr, uint16 width, uint16 height); -void seekfree_assistant_camera_boundary_config (seekfree_assistant_boundary_type_enum boundary_type, uint16 dot_num, void *dot_x1, void *dot_x2, void *dot_x3, void *dot_y1, void *dot_y2, void *dot_y3); -void seekfree_assistant_camera_send (void); - -void seekfree_assistant_data_analysis (void); -void seekfree_assistant_init (void); #endif diff --git a/Example/E09_timer_demo/libraries/zf_components/seekfree_assistant_interface.c b/Example/E09_timer_demo/libraries/zf_components/seekfree_assistant_interface.c index 99dbeef..fdade63 100644 --- a/Example/E09_timer_demo/libraries/zf_components/seekfree_assistant_interface.c +++ b/Example/E09_timer_demo/libraries/zf_components/seekfree_assistant_interface.c @@ -1,42 +1,55 @@ /********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant_interface * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ #include "zf_common_typedef.h" +#include "zf_common_fifo.h" #include "zf_common_debug.h" +#include "zf_driver_uart.h" +#include "zf_device_wireless_uart.h" +#include "zf_device_bluetooth_ch9141.h" +#include "zf_device_wifi_uart.h" +#include "zf_device_wifi_spi.h" #include "seekfree_assistant.h" +#include "seekfree_assistant_interface.h" + + +extern seekfree_assistant_transfer_callback_function seekfree_assistant_transfer_callback; // 数据发送函数指针 +extern seekfree_assistant_receive_callback_function seekfree_assistant_receive_callback; // 数据接收函数指针 + + //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手发送函数 // 参数说明 *buff 需要发送的数据地址 @@ -46,11 +59,9 @@ //------------------------------------------------------------------------------------------------------------------- ZF_WEAK uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length) { - uint32 len = 0; - - len = debug_send_buffer(buff, length); - - return len; + + // 当选择自定义通讯方式时 需要自行完成数据发送功能 + return length; } //------------------------------------------------------------------------------------------------------------------- @@ -62,11 +73,57 @@ ZF_WEAK uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length) //------------------------------------------------------------------------------------------------------------------- ZF_WEAK uint32 seekfree_assistant_receive (uint8 *buff, uint32 length) { - uint32 len = 0; + // 当选择自定义通讯方式时 需要自行完成数据接收功能 + return 0; +} - len = debug_read_ring_buffer(buff, length); - - return len; +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 逐飞助手接口 初始化 +// 参数说明 +// 返回参数 void +// 使用示例 seekfree_assistant_interface_init(SEEKFREE_ASSISTANT_WIFI_SPI); 使用高速WIFI SPI模块进行数据收发 +// 备注 需要自行调用设备的初始化,例如使用无线转串口进行数据的收发,则需要自行调用无线转串口的初始化,然后再调用seekfree_assistant_interface_init完成逐飞助手的接口初始化 +//------------------------------------------------------------------------------------------------------------------- +ZF_WEAK void seekfree_assistant_interface_init (seekfree_assistant_transfer_device_enum transfer_device) +{ + switch(transfer_device) + { + case SEEKFREE_ASSISTANT_DEBUG_UART: + { + seekfree_assistant_transfer_callback = debug_send_buffer; + seekfree_assistant_receive_callback = debug_read_ring_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIRELESS_UART: + { + seekfree_assistant_transfer_callback = wireless_uart_send_buffer; + seekfree_assistant_receive_callback = wireless_uart_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_CH9141: + { + seekfree_assistant_transfer_callback = bluetooth_ch9141_send_buffer; + seekfree_assistant_receive_callback = bluetooth_ch9141_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIFI_UART: + { + seekfree_assistant_transfer_callback = wifi_uart_send_buffer; + seekfree_assistant_receive_callback = wifi_uart_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIFI_SPI: + { + seekfree_assistant_transfer_callback = wifi_spi_send_buffer; + seekfree_assistant_receive_callback = wifi_spi_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_CUSTOM: + { + // 根据自己的需求 自行实现seekfree_assistant_transfer与seekfree_assistant_receive函数,完成数据的收发 + + }break; + } } diff --git a/Example/E09_timer_demo/libraries/zf_components/seekfree_assistant_interface.h b/Example/E09_timer_demo/libraries/zf_components/seekfree_assistant_interface.h new file mode 100644 index 0000000..940b5f7 --- /dev/null +++ b/Example/E09_timer_demo/libraries/zf_components/seekfree_assistant_interface.h @@ -0,0 +1,57 @@ +/********************************************************************************************************************* +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 +* Copyright (c) 2022 SEEKFREE 逐飞科技 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 +* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 +* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 +* +* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 +* 甚至没有隐含的适销性或适合特定用途的保证 +* 更多细节请参见 GPL +* +* 您应该在收到本开源库的同时收到一份 GPL 的副本 +* 如果没有,请参阅 +* +* 额外注明: +* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 +* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 +* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 +* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) +* +* 文件名称 seekfree_assistant_interface +* 公司名称 成都逐飞科技有限公司 +* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A +* 店铺链接 https://seekfree.taobao.com/ +* +* 修改记录 +* 日期 作者 备注 +* 2024-1-11 SeekFree first version +********************************************************************************************************************/ + +#ifndef _seekfree_assistant_interface_h_ +#define _seekfree_assistant_interface_h_ + + + +// 数据发送设备枚举 +typedef enum +{ + SEEKFREE_ASSISTANT_DEBUG_UART, // 调试串口 使用的串口由DEBUG_UART_INDEX宏定义指定 + SEEKFREE_ASSISTANT_WIRELESS_UART, // 无线转串口 + SEEKFREE_ASSISTANT_CH9141, // CH9141蓝牙 + SEEKFREE_ASSISTANT_WIFI_UART, // WIFI转串口 + SEEKFREE_ASSISTANT_WIFI_SPI, // 高速WIFI SPI + SEEKFREE_ASSISTANT_CUSTOM, // 自定义通讯方式 需要自行seekfree_assistant_transfer与seekfree_assistant_receive函数 +}seekfree_assistant_transfer_device_enum; + + +void seekfree_assistant_interface_init (seekfree_assistant_transfer_device_enum transfer_device); + + + +#endif diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_absolute_encoder.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_absolute_encoder.c index 7c80a3b..f9bc809 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_absolute_encoder.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_absolute_encoder.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_absolute_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_absolute_encoder.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_absolute_encoder.h index e6cc057..ed92906 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_absolute_encoder.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_absolute_encoder.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_absolute_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c index 500bccb..b0a06df 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_bluetooth_ch9141 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -54,7 +54,7 @@ #include "zf_device_camera.h" #include "zf_device_bluetooth_ch9141.h" -static fifo_obj_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 +static fifo_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 static uint8 bluetooth_ch9141_buffer[BLUETOOTH_CH9141_BUFFER_SIZE]; // 数据存放数组 static uint8 bluetooth_ch9141_data = 0; // 数据临时存放变量 diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h index 800be6c..ffb30b5 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h @@ -24,7 +24,7 @@ * 文件名称 main * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_camera.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_camera.c index 84c7aa0..68668c4 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_camera.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_camera.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_camera * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -45,7 +45,7 @@ #include "zf_device_camera.h" -fifo_obj_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 +fifo_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; // 定义摄像头接收数据缓冲区 uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // 定义摄像头数据发送到上位机的帧头 diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_camera.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_camera.h index 58efb06..2cd7d2d 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_camera.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_camera.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_camera * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -44,7 +44,7 @@ //=================================================摄像头公共库 基本配置================================================ #define CAMERA_RECEIVER_BUFFER_SIZE (8) // 定义摄像头接收数据缓冲区大小 -extern fifo_obj_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 +extern fifo_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 extern uint8 camera_send_image_frame_header[4]; // 声明摄像头数据发送到上位机的帧头 //=================================================摄像头公共库 基本配置================================================ diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_config.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_config.h index af6a3d8..6c8147d 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_config.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_config.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_config * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_dl1a.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_dl1a.c index 3e7410c..27be3a7 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_dl1a.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_dl1a.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1a * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_dl1a.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_dl1a.h index 89145d3..3176dd3 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_dl1a.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_dl1a.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1a * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_dl1b.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_dl1b.c index 90e64b3..96e472e 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_dl1b.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_dl1b.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1b * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_dl1b.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_dl1b.h index b144739..922b3ce 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_dl1b.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_dl1b.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1b * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_gnss.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_gnss.c new file mode 100644 index 0000000..caf7cd0 --- /dev/null +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_gnss.c @@ -0,0 +1,620 @@ +/********************************************************************************************************************* +* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* Copyright (c) 2022 SEEKFREE 逐飞科技 +* +* 本文件是 TC264 开源库的一部分 +* +* TC264 开源库 是免费软件 +* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 +* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 +* +* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 +* 甚至没有隐含的适销性或适合特定用途的保证 +* 更多细节请参见 GPL +* +* 您应该在收到本开源库的同时收到一份 GPL 的副本 +* 如果没有,请参阅 +* +* 额外注明: +* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 +* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 +* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 +* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) +* +* 文件名称 zf_device_gnss +* 公司名称 成都逐飞科技有限公司 +* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 +* 开发环境 ADS v1.9.20 +* 适用平台 TC264D +* 店铺链接 https://seekfree.taobao.com/ +* +* 修改记录 +* 日期 作者 备注 +* 2023-12-28 pudding first version +********************************************************************************************************************/ +/********************************************************************************************************************* +* 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* RX 查看 zf_device_gnss.h 中 GNSS_RX 宏定义 +* TX 查看 zf_device_gnss.h 中 GNSS_TX 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* ------------------------------------ +********************************************************************************************************************/ + +#include "math.h" +#include "zf_common_function.h" +#include "zf_common_fifo.h" +#include "zf_driver_delay.h" +#include "zf_driver_uart.h" + +#include "zf_device_gnss.h" + +#define GNSS_BUFFER_SIZE ( 128 ) + +uint8 gnss_flag = 0; // 1:采集完成等待处理数据 0:没有采集完成 +gnss_info_struct gnss; // GPS解析之后的数据 + +static uint8 gnss_state = 0; // 1:GPS初始化完成 +static fifo_struct gnss_receiver_fifo; // +static uint8 gnss_receiver_buffer[GNSS_BUFFER_SIZE]; // 数据存放数组 + +static gps_state_enum gnss_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 +static gps_state_enum gnss_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 +static gps_state_enum gnss_ths_state = GPS_STATE_RECEIVING; // rmc 语句状态 + +static uint8 gps_gga_buffer[GNSS_BUFFER_SIZE]; +static uint8 gps_rmc_buffer[GNSS_BUFFER_SIZE]; +static uint8 gps_ths_buffer[GNSS_BUFFER_SIZE]; + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 获取指定 ',' 后面的索引 +// 参数说明 num 第几个逗号 +// 参数说明 *str 字符串 +// 返回参数 uint8 返回索引 +// 使用示例 get_parameter_index(1, s); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 get_parameter_index (uint8 num, char *str) +{ + uint8 i = 0, j = 0; + char *temp = strchr(str, '\n'); + uint8 len = 0, len1 = 0; + + 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; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 给定字符串第一个 ',' 之前的数据转换为int +// 参数说明 *s 字符串 +// 返回参数 float 返回数值 +// 使用示例 get_int_number(&buf[get_parameter_index(7, buf)]); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static int get_int_number (char *s) +{ + char buf[10]; + uint8 i = 0; + int return_value = 0; + i = get_parameter_index(1, s); + i = i - 1; + strncpy(buf, s, i); + buf[i] = 0; + return_value = func_str_to_int(buf); + return return_value; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 给定字符串第一个 ',' 之前的数据转换为float +// 参数说明 *s 字符串 +// 返回参数 float 返回数值 +// 使用示例 get_float_number(&buf[get_parameter_index(8, buf)]); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static float get_float_number (char *s) +{ + uint8 i = 0; + char buf[15]; + float return_value = 0; + + i = get_parameter_index(1, s); + i = i - 1; + strncpy(buf, s, i); + buf[i] = 0; + return_value = (float)func_str_to_double(buf); + return return_value; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 给定字符串第一个 ',' 之前的数据转换为double +// 参数说明 *s 字符串 +// 返回参数 double 返回数值 +// 使用示例 get_double_number(&buf[get_parameter_index(3, buf)]); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static double get_double_number (char *s) +{ + uint8 i = 0; + char buf[15]; + double return_value = 0; + + i = get_parameter_index(1, s); + i = i - 1; + strncpy(buf, s, i); + buf[i] = 0; + return_value = func_str_to_double(buf); + return return_value; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 世界时间转换为北京时间 +// 参数说明 *time 保存的时间 +// 返回参数 void +// 使用示例 utc_to_btc(&gnss->time); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static void utc_to_btc (gps_time_struct *time) +{ + uint8 day_num = 0; + + time->hour = time->hour + 8; + if(23 < time->hour) + { + time->hour -= 24; + time->day += 1; + + if(2 == time->month) + { + day_num = 28; + if((0 == time->year % 4 && 0 != time->year % 100) || 0 == time->year % 400) // 判断是否为闰年 + { + day_num ++; // 闰月 2月为29天 + } + } + else + { + day_num = 31; // 1 3 5 7 8 10 12这些月份为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(12 < time->month) + { + time->month -= 12; + time->year ++; + } + } + } +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 RMC语句解析 +// 参数说明 *line 接收到的语句信息 +// 参数说明 *gnss 保存解析后的数据 +// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 +// 使用示例 gps_gnrmc_parse((char *)data_buffer, &gnss); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 gps_gnrmc_parse (char *line, gnss_info_struct *gnss) +{ + uint8 state = 0, temp = 0; + + double latitude = 0; // 纬度 + double longitude = 0; // 经度 + + double lati_cent_tmp = 0, lati_second_tmp = 0; + double long_cent_tmp = 0, long_second_tmp = 0; + float speed_tmp = 0; + char *buf = line; + uint8 return_state = 0; + + state = buf[get_parameter_index(2, buf)]; + + if('A' == state) // 如果数据有效 则解析数据 + { + return_state = 1; + gnss->state = 1; + gnss -> ns = buf[get_parameter_index(4, buf)]; + gnss -> 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)]); + + gnss->latitude_degree = (int)latitude / 100; // 纬度转换为度分秒 + lati_cent_tmp = (latitude - gnss->latitude_degree * 100); + gnss->latitude_cent = (int)lati_cent_tmp; + lati_second_tmp = (lati_cent_tmp - gnss->latitude_cent) * 6000; + gnss->latitude_second = (int)lati_second_tmp; + + gnss->longitude_degree = (int)longitude / 100; // 经度转换为度分秒 + long_cent_tmp = (longitude - gnss->longitude_degree * 100); + gnss->longitude_cent = (int)long_cent_tmp; + long_second_tmp = (long_cent_tmp - gnss->longitude_cent) * 6000; + gnss->longitude_second = (int)long_second_tmp; + + gnss->latitude = gnss->latitude_degree + lati_cent_tmp / 60; + gnss->longitude = gnss->longitude_degree + long_cent_tmp / 60; + + speed_tmp = get_float_number(&buf[get_parameter_index(7, buf)]); // 速度(海里/小时) + gnss->speed = speed_tmp * 1.85f; // 转换为公里/小时 + gnss->direction = get_float_number(&buf[get_parameter_index(8, buf)]); // 角度 + } + else + { + gnss->state = 0; + } + + // 在定位没有生效前也是有时间数据的,可以直接解析 + gnss->time.hour = (buf[7] - '0') * 10 + (buf[8] - '0'); // 时间 + gnss->time.minute = (buf[9] - '0') * 10 + (buf[10] - '0'); + gnss->time.second = (buf[11] - '0') * 10 + (buf[12] - '0'); + temp = get_parameter_index(9, buf); + gnss->time.day = (buf[temp + 0] - '0') * 10 + (buf[temp + 1] - '0'); // 日期 + gnss->time.month = (buf[temp + 2] - '0') * 10 + (buf[temp + 3] - '0'); + gnss->time.year = (buf[temp + 4] - '0') * 10 + (buf[temp + 5] - '0') + 2000; + + utc_to_btc(&gnss->time); + + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 GGA语句解析 +// 参数说明 *line 接收到的语句信息 +// 参数说明 *gnss 保存解析后的数据 +// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 +// 使用示例 gps_gngga_parse((char *)data_buffer, &gnss); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 gps_gngga_parse (char *line, gnss_info_struct *gnss) +{ + uint8 state = 0; + char *buf = line; + uint8 return_state = 0; + + state = buf[get_parameter_index(2, buf)]; + + if(',' != state) + { + gnss->satellite_used = (uint8)get_int_number(&buf[get_parameter_index(7, buf)]); + gnss->height = get_float_number(&buf[get_parameter_index(9, buf)]) + get_float_number(&buf[get_parameter_index(11, buf)]); // 高度 = 海拔高度 + 地球椭球面相对大地水准面的高度 + return_state = 1; + } + + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 THS语句解析 +// 参数说明 *line 接收到的语句信息 +// 参数说明 *gnss 保存解析后的数据 +// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 +// 使用示例 gps_gnths_parse((char *)data_buffer, &gnss); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 gps_gnths_parse (char *line, gnss_info_struct *gnss) +{ + uint8 state = 0; + char *buf = line; + uint8 return_state = 0; + + state = buf[get_parameter_index(2, buf)]; + + if('A' == state) + { + gnss->antenna_direction_state = 1; + gnss->antenna_direction = get_float_number(&buf[get_parameter_index(1, buf)]); + return_state = 1; + } + else + { + gnss->antenna_direction_state = 0; + } + + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 计算从第一个点到第二个点的距离 +// 参数说明 latitude1 第一个点的纬度 +// 参数说明 longitude1 第一个点的经度 +// 参数说明 latitude2 第二个点的纬度 +// 参数说明 longitude2 第二个点的经度 +// 返回参数 double 返回两点距离 +// 使用示例 get_two_points_distance(latitude1_1, longitude1, latitude2, longitude2); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +double get_two_points_distance (double latitude1, double longitude1, double latitude2, double longitude2) +{ + const double EARTH_RADIUS = 6378137; // 地球半径(单位:m) + double rad_latitude1 = 0; + double rad_latitude2 = 0; + double rad_longitude1 = 0; + double rad_longitude2 = 0; + double distance = 0; + double a = 0; + double b = 0; + + rad_latitude1 = ANGLE_TO_RAD(latitude1); // 根据角度计算弧度 + 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 里面实现的算法 + distance = distance * EARTH_RADIUS; + + return distance; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 计算从第一个点到第二个点的方位角 +// 参数说明 latitude1 第一个点的纬度 +// 参数说明 longitude1 第一个点的经度 +// 参数说明 latitude2 第二个点的纬度 +// 参数说明 longitude2 第二个点的经度 +// 返回参数 double 返回方位角(0至360) +// 使用示例 get_two_points_azimuth(latitude1_1, longitude1, latitude2, longitude2); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +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 ((0 < angle) ? angle : (angle + 360)); +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 解析GPS数据 +// 参数说明 void +// 返回参数 uint8 0-解析成功 1-解析失败 可能数据包错误 +// 使用示例 gps_data_parse(); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +uint8 gnss_data_parse (void) +{ + uint8 return_state = 0; + uint8 check_buffer[5] = {'0', 'x', 0x00, 0x00, 0x00}; + uint8 bbc_xor_origin = 0; + uint8 bbc_xor_calculation = 0; + uint32 data_len = 0; + + do + { + if(GPS_STATE_RECEIVED == gnss_rmc_state) + { + gnss_rmc_state = GPS_STATE_PARSING; + strncpy((char *)&check_buffer[2], strchr((const char *)gps_rmc_buffer, '*') + 1, 2); + bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); + for(bbc_xor_calculation = gps_rmc_buffer[1], data_len = 2; '*' != gps_rmc_buffer[data_len]; data_len ++) + { + bbc_xor_calculation ^= gps_rmc_buffer[data_len]; + } + if(bbc_xor_calculation != bbc_xor_origin) + { + // 数据校验失败 + return_state = 1; + break; + } + + gps_gnrmc_parse((char *)gps_rmc_buffer, &gnss); + } + gnss_rmc_state = GPS_STATE_RECEIVING; + + if(GPS_STATE_RECEIVED == gnss_gga_state) + { + gnss_gga_state = GPS_STATE_PARSING; + strncpy((char *)&check_buffer[2], strchr((const char *)gps_gga_buffer, '*') + 1, 2); + bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); + + for(bbc_xor_calculation = gps_gga_buffer[1], data_len = 2; '*' != gps_gga_buffer[data_len]; data_len ++) + { + bbc_xor_calculation ^= gps_gga_buffer[data_len]; + } + if(bbc_xor_calculation != bbc_xor_origin) + { + // 数据校验失败 + return_state = 1; + break; + } + + gps_gngga_parse((char *)gps_gga_buffer, &gnss); + } + gnss_gga_state = GPS_STATE_RECEIVING; + + if(GPS_STATE_RECEIVED == gnss_ths_state) + { + gnss_ths_state = GPS_STATE_PARSING; + strncpy((char *)&check_buffer[2], strchr((const char *)gps_ths_buffer, '*') + 1, 2); + bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); + + for(bbc_xor_calculation = gps_ths_buffer[1], data_len = 2; '*' != gps_ths_buffer[data_len]; data_len ++) + { + bbc_xor_calculation ^= gps_ths_buffer[data_len]; + } + if(bbc_xor_calculation != bbc_xor_origin) + { + // 数据校验失败 + return_state = 1; + break; + } + + gps_gnths_parse((char *)gps_ths_buffer, &gnss); + } + gnss_ths_state = GPS_STATE_RECEIVING; + + }while(0); + return return_state; +} + + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 GPS串口回调函数 +// 参数说明 void +// 返回参数 void +// 使用示例 gps_uart_callback(); +// 备注信息 此函数需要在串口接收中断内进行调用 +//------------------------------------------------------------------------------------------------------------------- +void gnss_uart_callback (void) +{ + uint8 temp_gps[6]; + uint32 temp_length = 0; + + + + + if(gnss_state) + { + uint8 dat; + while(uart_query_byte(GNSS_UART, &dat)) + { + fifo_write_buffer(&gnss_receiver_fifo, &dat, 1); + } + + if('\n' == dat) + { + // 读取前6个数据 用于判断语句类型 + temp_length = 6; + fifo_read_buffer(&gnss_receiver_fifo, temp_gps, &temp_length, FIFO_READ_ONLY); + + // 根据不同类型将数据拷贝到不同的缓冲区 + if(0 == strncmp((char *)&temp_gps[3], "RMC", 3)) + { + // 如果没有在解析数据则更新缓冲区的数据 + if(GPS_STATE_PARSING != gnss_rmc_state) + { + gnss_rmc_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_rmc_buffer, &temp_length, FIFO_READ_AND_CLEAN); + } + } + else if(0 == strncmp((char *)&temp_gps[3], "GGA", 3)) + { + // 如果没有在解析数据则更新缓冲区的数据 + if(GPS_STATE_PARSING != gnss_gga_state) + { + gnss_gga_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_gga_buffer, &temp_length, FIFO_READ_AND_CLEAN); + } + } + else if(0 == strncmp((char *)&temp_gps[3], "THS", 3)) + { + // 如果没有在解析数据则更新缓冲区的数据 + if(GPS_STATE_PARSING != gnss_ths_state) + { + gnss_ths_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_ths_buffer, &temp_length, FIFO_READ_AND_CLEAN); + } + } + + // 统一将FIFO清空 + fifo_clear(&gnss_receiver_fifo); + + gnss_flag = 1; + } + } +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 GPS初始化 +// 参数说明 void +// 返回参数 void +// 使用示例 gps_init(); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +void gnss_init (gps_device_enum gps_device) +{ + 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}; + + if((TAU1201 == gps_device) || (GN42A == gps_device)) + { + fifo_init(&gnss_receiver_fifo, FIFO_DATA_8BIT, gnss_receiver_buffer, GNSS_BUFFER_SIZE); + system_delay_ms(500); // 等待GPS启动后开始初始化 + uart_init(GNSS_UART, 115200, GNSS_RX, GNSS_TX); + + uart_write_buffer(GNSS_UART, (uint8 *)set_rate, sizeof(set_rate)); // 设置GPS更新速率为10hz 如果不调用此语句则默认为1hz + system_delay_ms(200); + + uart_write_buffer(GNSS_UART, (uint8 *)open_rmc, sizeof(open_rmc)); // 开启rmc语句 + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)open_gga, sizeof(open_gga)); // 开启gga语句 + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gll, sizeof(close_gll)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gsa, sizeof(close_gsa)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_grs, sizeof(close_grs)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gsv, sizeof(close_gsv)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_vtg, sizeof(close_vtg)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_zda, sizeof(close_zda)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gst, sizeof(close_gst)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_txt, sizeof(close_txt)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_txt_ant, sizeof(close_txt_ant)); + system_delay_ms(50); + + gnss_state = 1; + uart_rx_interrupt(GNSS_UART, 1); + } + else if(GN43RFA == gps_device) + { + // GN43RFA RTK模块不需要进行参数设置,如果需要修改参数应该使用专用的上位机修改参数 + fifo_init(&gnss_receiver_fifo, FIFO_DATA_8BIT, gnss_receiver_buffer, GNSS_BUFFER_SIZE); + uart_init(GNSS_UART, 115200, GNSS_RX, GNSS_TX); + gnss_state = 1; + uart_rx_interrupt(GNSS_UART, 1); + } + +} diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_gnss.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_gnss.h new file mode 100644 index 0000000..5d58976 --- /dev/null +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_gnss.h @@ -0,0 +1,125 @@ +/********************************************************************************************************************* +* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* Copyright (c) 2022 SEEKFREE 逐飞科技 +* +* 本文件是 TC264 开源库的一部分 +* +* TC264 开源库 是免费软件 +* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 +* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 +* +* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 +* 甚至没有隐含的适销性或适合特定用途的保证 +* 更多细节请参见 GPL +* +* 您应该在收到本开源库的同时收到一份 GPL 的副本 +* 如果没有,请参阅 +* +* 额外注明: +* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 +* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 +* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 +* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) +* +* 文件名称 zf_device_gnss +* 公司名称 成都逐飞科技有限公司 +* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 +* 开发环境 ADS v1.9.20 +* 适用平台 TC264D +* 店铺链接 https://seekfree.taobao.com/ +* +* 修改记录 +* 日期 作者 备注 +* 2023-12-28 pudding first version +********************************************************************************************************************/ +/********************************************************************************************************************* +* 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* RX 查看 zf_device_gnss.h 中 GNSS_RX 宏定义 +* TX 查看 zf_device_gnss.h 中 GNSS_TX 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* ------------------------------------ +********************************************************************************************************************/ + +#ifndef _zf_device_gnss_h_ +#define _zf_device_gnss_h_ + +#include "zf_common_typedef.h" + +//-------------------------------------------------------------------------------------------------- +//引脚配置 +//-------------------------------------------------------------------------------------------------- +#define GNSS_UART (UART_3) +#define GNSS_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 +#define GNSS_TX (UART3_RX_P15_7) // GPS TX串口引脚 + +#define ANGLE_TO_RAD(x) ( (x) * PI / 180.0 ) // 角度转换为弧度 +#define RAD_TO_ANGLE(x) ( (x) * 180.0 / PI ) // 弧度转换为角度 +#define PI ( 3.1415926535898 ) + +typedef enum +{ + TAU1201 = 1, // 逐飞科技双频GPS模块 + GN42A = 1, // 逐飞科技双频GPS模块 与TAU1201是一样的 + GN43RFA = 2, // 逐飞科技三频RTK模块 +}gps_device_enum; + +typedef struct +{ + uint16 year; + uint8 month; + uint8 day; + uint8 hour; + uint8 minute; + uint8 second; +}gps_time_struct; + +typedef struct +{ + gps_time_struct time; // 时间 + + uint8 state; // 有效状态 1:定位有效 0:定位无效 + + uint16 latitude_degree; // 度 + uint16 latitude_cent; // 分 + uint16 latitude_second; // 秒 这里的秒是被放大了100倍的,主要是避免使用浮点数 + uint16 longitude_degree; // 度 + uint16 longitude_cent; // 分 + uint16 longitude_second; // 秒 这里的秒是被放大了100倍的,主要是避免使用浮点数 + + double latitude; // 纬度 + double longitude; // 经度 + + int8 ns; // 纬度半球 N(北半球)或 S(南半球) + int8 ew; // 经度半球 E(东经)或 W(西经) + + float speed; // 速度(公里/每小时) + float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准)+ + uint8 antenna_direction_state; // 双天线测向有效状态 1:测向有效 0:测向无效,无效时antenna_direction数据是无效的 + float antenna_direction; // 主天线指向从天线与真北构成的夹角(000.0~359.9 度) + + // 下面两个个信息从GNGGA语句中获取 + uint8 satellite_used; // 用于定位的卫星数量 + float height; // 高度 +}gnss_info_struct; + +typedef enum +{ + GPS_STATE_RECEIVING, // 正在接收数据 + GPS_STATE_RECEIVED, // 数据接收完成 + GPS_STATE_PARSING, // 正在解析 +}gps_state_enum; + +extern gnss_info_struct gnss; +extern uint8 gnss_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); +uint8 gnss_data_parse (void); +void gnss_uart_callback (void); +void gnss_init (gps_device_enum gps_device); + +#endif diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_gps_tau1201.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_gps_tau1201.c deleted file mode 100644 index da46a99..0000000 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_gps_tau1201.c +++ /dev/null @@ -1,541 +0,0 @@ -/********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 -* Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 -* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 -* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* -* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 -* 甚至没有隐含的适销性或适合特定用途的保证 -* 更多细节请参见 GPL -* -* 您应该在收到本开源库的同时收到一份 GPL 的副本 -* 如果没有,请参阅 -* -* 额外注明: -* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 -* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 -* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 -* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* -* 文件名称 zf_device_gps_tau1201 -* 公司名称 成都逐飞科技有限公司 -* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D -* 店铺链接 https://seekfree.taobao.com/ -* -* 修改记录 -* 日期 作者 备注 -* 2022-09-15 pudding first version -* 2023-04-28 pudding 增加中文注释说明 -********************************************************************************************************************/ -/******************************************************************************************************************** -* 接线定义: -* ------------------------------------ -* 模块管脚 单片机管脚 -* RX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_RX 宏定义 -* TX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_TX 宏定义 -* VCC 3.3V电源 -* GND 电源地 -* ------------------------------------ -********************************************************************************************************************/ - -#include "math.h" -#include "zf_common_function.h" -#include "zf_common_fifo.h" -#include "zf_driver_delay.h" -#include "zf_driver_uart.h" - -#include "zf_device_gps_tau1201.h" - -#define GPS_TAU1201_BUFFER_SIZE ( 128 ) - -uint8 gps_tau1201_flag = 0; // 1:采集完成等待处理数据 0:没有采集完成 -gps_info_struct gps_tau1201; // GPS解析之后的数据 - -static uint8 gps_tau1201_state = 0; // 1:GPS初始化完成 -static fifo_obj_struct gps_tau1201_receiver_fifo; // -static uint8 gps_tau1201_receiver_buffer[GPS_TAU1201_BUFFER_SIZE]; // 数据存放数组 - -gps_state_enum gps_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 -gps_state_enum gps_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 - -static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; // GGA语句缓冲区 -static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; // RMC语句缓冲区 - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 获取指定 ',' 后面的索引 -// 参数说明 num 第几个逗号 -// 参数说明 *str 字符串 -// 返回参数 uint8 返回索引 -// 使用示例 get_parameter_index(1, s); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static uint8 get_parameter_index (uint8 num, char *str) -{ - uint8 i = 0, j = 0; - char *temp = strchr(str, '\n'); - uint8 len = 0, len1 = 0; - - 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; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 给定字符串第一个 ',' 之前的数据转换为int -// 参数说明 *s 字符串 -// 返回参数 float 返回数值 -// 使用示例 get_int_number(&buf[get_parameter_index(7, buf)]); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static int get_int_number (char *s) -{ - char buf[10]; - uint8 i = 0; - int return_value = 0; - i = get_parameter_index(1, s); - i = i - 1; - strncpy(buf, s, i); - buf[i] = 0; - return_value = func_str_to_int(buf); - return return_value; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 给定字符串第一个 ',' 之前的数据转换为float -// 参数说明 *s 字符串 -// 返回参数 float 返回数值 -// 使用示例 get_float_number(&buf[get_parameter_index(8, buf)]); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static float get_float_number (char *s) -{ - uint8 i = 0; - char buf[15]; - float return_value = 0; - - i = get_parameter_index(1, s); - i = i - 1; - strncpy(buf, s, i); - buf[i] = 0; - return_value = (float)func_str_to_double(buf); - return return_value; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 给定字符串第一个 ',' 之前的数据转换为double -// 参数说明 *s 字符串 -// 返回参数 double 返回数值 -// 使用示例 get_double_number(&buf[get_parameter_index(3, buf)]); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static double get_double_number (char *s) -{ - uint8 i = 0; - char buf[15]; - double return_value = 0; - - i = get_parameter_index(1, s); - i = i - 1; - strncpy(buf, s, i); - buf[i] = 0; - return_value = func_str_to_double(buf); - return return_value; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 世界时间转换为北京时间 -// 参数说明 *time 保存的时间 -// 返回参数 void -// 使用示例 utc_to_btc(&gps->time); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static void utc_to_btc (gps_time_struct *time) -{ - uint8 day_num = 0; - - time->hour = time->hour + 8; - if(23 < time->hour) - { - time->hour -= 24; - time->day += 1; - - if(2 == time->month) - { - day_num = 28; - if((0 == time->year % 4 && 0 != time->year % 100) || 0 == time->year % 400) // 判断是否为闰年 - { - day_num ++; // 闰月 2月为29天 - } - } - else - { - day_num = 31; // 1 3 5 7 8 10 12这些月份为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(12 < time->month) - { - time->month -= 12; - time->year ++; - } - } - } -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 RMC语句解析 -// 参数说明 *line 接收到的语句信息 -// 参数说明 *gps 保存解析后的数据 -// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 -// 使用示例 gps_gnrmc_parse((char *)data_buffer, &gps_tau1201); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static uint8 gps_gnrmc_parse (char *line, gps_info_struct *gps) -{ - uint8 state = 0, temp = 0; - - double latitude = 0; // 纬度 - double longitude = 0; // 经度 - - double lati_cent_tmp = 0, lati_second_tmp = 0; - double long_cent_tmp = 0, long_second_tmp = 0; - float speed_tmp = 0; - char *buf = line; - uint8 return_state = 0; - - state = buf[get_parameter_index(2, buf)]; - - gps->state = 0; - if('A' == state) // 如果数据有效 则解析数据 - { - return_state = 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; // 纬度转换为度分秒 - lati_cent_tmp = (latitude - gps->latitude_degree * 100); - gps->latitude_cent = (int)lati_cent_tmp; - lati_second_tmp = (lati_cent_tmp - gps->latitude_cent) * 6000; - gps->latitude_second = (int)lati_second_tmp; - - gps->longitude_degree = (int)longitude / 100; // 经度转换为度分秒 - long_cent_tmp = (longitude - gps->longitude_degree * 100); - gps->longitude_cent = (int)long_cent_tmp; - long_second_tmp = (long_cent_tmp - gps->longitude_cent) * 6000; - gps->longitude_second = (int)long_second_tmp; - - gps->latitude = gps->latitude_degree + lati_cent_tmp / 60; - gps->longitude = gps->longitude_degree + long_cent_tmp / 60; - - speed_tmp = get_float_number(&buf[get_parameter_index(7, buf)]); // 速度(海里/小时) - gps->speed = speed_tmp * 1.85f; // 转换为公里/小时 - gps->direction = get_float_number(&buf[get_parameter_index(8, buf)]); // 角度 - } - - // 在定位没有生效前也是有时间数据的,可以直接解析 - gps->time.hour = (buf[7] - '0') * 10 + (buf[8] - '0'); // 时间 - 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'); // 日期 - 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_state; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 GGA语句解析 -// 参数说明 *line 接收到的语句信息 -// 参数说明 *gps 保存解析后的数据 -// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 -// 使用示例 gps_gngga_parse((char *)data_buffer, &gps_tau1201); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static uint8 gps_gngga_parse (char *line, gps_info_struct *gps) -{ - uint8 state = 0; - char *buf = line; - uint8 return_state = 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)]); // 高度 = 海拔高度 + 地球椭球面相对大地水准面的高度 - return_state = 1; - } - - return return_state; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 计算从第一个点到第二个点的距离 -// 参数说明 latitude1 第一个点的纬度 -// 参数说明 longitude1 第一个点的经度 -// 参数说明 latitude2 第二个点的纬度 -// 参数说明 longitude2 第二个点的经度 -// 返回参数 double 返回两点距离 -// 使用示例 get_two_points_distance(latitude1_1, longitude1, latitude2, longitude2); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -double get_two_points_distance (double latitude1, double longitude1, double latitude2, double longitude2) -{ - const double EARTH_RADIUS = 6378137; // 地球半径(单位:m) - double rad_latitude1 = 0; - double rad_latitude2 = 0; - double rad_longitude1 = 0; - double rad_longitude2 = 0; - double distance = 0; - double a = 0; - double b = 0; - - rad_latitude1 = ANGLE_TO_RAD(latitude1); // 根据角度计算弧度 - 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 里面实现的算法 - distance = distance * EARTH_RADIUS; - - return distance; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 计算从第一个点到第二个点的方位角 -// 参数说明 latitude1 第一个点的纬度 -// 参数说明 longitude1 第一个点的经度 -// 参数说明 latitude2 第二个点的纬度 -// 参数说明 longitude2 第二个点的经度 -// 返回参数 double 返回方位角(0至360) -// 使用示例 get_two_points_azimuth(latitude1_1, longitude1, latitude2, longitude2); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -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 ((0 < angle) ? angle : (angle + 360)); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 解析GPS数据 -// 参数说明 void -// 返回参数 uint8 0-解析成功 1-解析失败 可能数据包错误 -// 使用示例 gps_data_parse(); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -uint8 gps_data_parse (void) -{ - uint8 return_state = 0; - uint8 check_buffer[5] = {'0', 'x', 0x00, 0x00, 0x00}; - uint8 bbc_xor_origin = 0; - uint8 bbc_xor_calculation = 0; - uint32 data_len = 0; - - do - { - if(GPS_STATE_RECEIVED == gps_rmc_state) - { - gps_rmc_state = GPS_STATE_PARSING; - strncpy((char *)&check_buffer[2], strchr((const char *)gps_rmc_buffer, '*') + 1, 2); - bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); - for(bbc_xor_calculation = gps_rmc_buffer[1], data_len = 2; '*' != gps_rmc_buffer[data_len]; data_len ++) - { - bbc_xor_calculation ^= gps_rmc_buffer[data_len]; - } - if(bbc_xor_calculation != bbc_xor_origin) - { - // 数据校验失败 - return_state = 1; - break; - } - - gps_gnrmc_parse((char *)gps_rmc_buffer, &gps_tau1201); - } - gps_rmc_state = GPS_STATE_RECEIVING; - - if(GPS_STATE_RECEIVED == gps_gga_state) - { - gps_gga_state = GPS_STATE_PARSING; - strncpy((char *)&check_buffer[2], strchr((const char *)gps_gga_buffer, '*') + 1, 2); - bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); - - for(bbc_xor_calculation = gps_gga_buffer[1], data_len = 2; '*' != gps_gga_buffer[data_len]; data_len ++) - { - bbc_xor_calculation ^= gps_gga_buffer[data_len]; - } - if(bbc_xor_calculation != bbc_xor_origin) - { - // 数据校验失败 - return_state = 1; - break; - } - - gps_gngga_parse((char *)gps_gga_buffer, &gps_tau1201); - } - gps_gga_state = GPS_STATE_RECEIVING; - - }while(0); - return return_state; -} - - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 GPS串口回调函数 -// 参数说明 void -// 返回参数 void -// 使用示例 gps_uart_callback(); -// 备注信息 此函数需要在串口接收中断内进行调用 -//------------------------------------------------------------------------------------------------------------------- -void gps_uart_callback (void) -{ - uint8 temp_gps[6]; - uint32 temp_length = 0; - - if(gps_tau1201_state) - { - uint8 dat; - while(uart_query_byte(GPS_TAU1201_UART, &dat)) - { - fifo_write_buffer(&gps_tau1201_receiver_fifo, &dat, 1); - } - - if('\n' == dat) - { - // 读取前6个数据 用于判断语句类型 - temp_length = 6; - fifo_read_buffer(&gps_tau1201_receiver_fifo, temp_gps, &temp_length, FIFO_READ_ONLY); - - // 根据不同类型将数据拷贝到不同的缓冲区 - if(0 == strncmp((char *)&temp_gps[3], "RMC", 3)) - { - // 如果没有在解析数据则更新缓冲区的数据 - if(GPS_STATE_PARSING != gps_rmc_state) - { - gps_rmc_state = GPS_STATE_RECEIVED; - temp_length = fifo_used(&gps_tau1201_receiver_fifo); - fifo_read_buffer(&gps_tau1201_receiver_fifo, gps_rmc_buffer, &temp_length, FIFO_READ_AND_CLEAN); - } - } - else if(0 == strncmp((char *)&temp_gps[3], "GGA", 3)) - { - // 如果没有在解析数据则更新缓冲区的数据 - if(GPS_STATE_PARSING != gps_gga_state) - { - gps_gga_state = GPS_STATE_RECEIVED; - temp_length = fifo_used(&gps_tau1201_receiver_fifo); - fifo_read_buffer(&gps_tau1201_receiver_fifo, gps_gga_buffer, &temp_length, FIFO_READ_AND_CLEAN); - } - } - - // 统一将FIFO清空 - fifo_clear(&gps_tau1201_receiver_fifo); - - gps_tau1201_flag = 1; - } - } -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 GPS初始化 -// 参数说明 void -// 返回参数 void -// 使用示例 gps_init(); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -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}; - - fifo_init(&gps_tau1201_receiver_fifo, FIFO_DATA_8BIT, gps_tau1201_receiver_buffer, GPS_TAU1201_BUFFER_SIZE); - system_delay_ms(500); // 等待GPS启动后开始初始化 - uart_init(GPS_TAU1201_UART, 115200, GPS_TAU1201_RX, GPS_TAU1201_TX); - uart_rx_interrupt(GPS_TAU1201_UART, 0); - - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)set_rate, sizeof(set_rate)); // 设置GPS更新速率为10hz 如果不调用此语句则默认为1hz - system_delay_ms(200); - - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)open_rmc, sizeof(open_rmc)); // 开启rmc语句 - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)open_gga, sizeof(open_gga)); // 开启gga语句 - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gll, sizeof(close_gll)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gsa, sizeof(close_gsa)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_grs, sizeof(close_grs)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gsv, sizeof(close_gsv)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_vtg, sizeof(close_vtg)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_zda, sizeof(close_zda)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gst, sizeof(close_gst)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_txt, sizeof(close_txt)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_txt_ant, sizeof(close_txt_ant)); - system_delay_ms(50); - - gps_tau1201_state = 1; - uart_rx_interrupt(GPS_TAU1201_UART, 1); -} diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_gps_tau1201.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_gps_tau1201.h deleted file mode 100644 index c167bae..0000000 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_gps_tau1201.h +++ /dev/null @@ -1,117 +0,0 @@ -/********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 -* Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 -* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 -* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* -* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 -* 甚至没有隐含的适销性或适合特定用途的保证 -* 更多细节请参见 GPL -* -* 您应该在收到本开源库的同时收到一份 GPL 的副本 -* 如果没有,请参阅 -* -* 额外注明: -* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 -* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 -* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 -* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* -* 文件名称 zf_device_gps_tau1201 -* 公司名称 成都逐飞科技有限公司 -* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D -* 店铺链接 https://seekfree.taobao.com/ -* -* 修改记录 -* 日期 作者 备注 -* 2022-09-15 pudding first version -* 2023-04-28 pudding 增加中文注释说明 -********************************************************************************************************************/ -/******************************************************************************************************************** -* 接线定义: -* ------------------------------------ -* 模块管脚 单片机管脚 -* RX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_RX 宏定义 -* TX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_TX 宏定义 -* VCC 3.3V电源 -* GND 电源地 -* ------------------------------------ -********************************************************************************************************************/ - -#ifndef _zf_device_gps_tau1201_h_ -#define _zf_device_gps_tau1201_h_ - -#include "zf_common_typedef.h" - -//=================================================定义 定位模块 基本配置================================================ -#define GPS_TAU1201_UART (UART_3) -#define GPS_TAU1201_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 -#define GPS_TAU1201_TX (UART3_RX_P15_7) // GPS TX串口引脚 - -#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 -#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 -#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; // 时间- - uint8 state; // 有效状态 1:定位有效 0:定位无效 - uint16 latitude_degree; // 度 - uint16 latitude_cent; // 分 - uint16 latitude_second; // 秒 - uint16 longitude_degree; // 度 - uint16 longitude_cent; // 分 - uint16 longitude_second; // 秒 - double latitude; // 纬度 - double longitude; // 经度 - int8 ns; // 纬度半球 N(北半球)或 S(南半球) - int8 ew; // 经度半球 E(东经)或 W(西经) - float speed; // 速度(公里/每小时) - float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) - // 下面两个个信息从GNGGA语句中获取 - uint8 satellite_used; // 用于定位的卫星数量 - float height; // 高度 -}gps_info_struct; - -typedef enum -{ - GPS_STATE_RECEIVING, // 正在接收数据 - GPS_STATE_RECEIVED, // 数据接收完成 - GPS_STATE_PARSING, // 正在解析 -}gps_state_enum; -//================================================定义 定位模块 参数结构体================================================ - - -//=================================================声明 定位模块 全局变量================================================ -extern gps_info_struct gps_tau1201; // GPS解析之后的数据 -extern uint8 gps_tau1201_flag; // 1:采集完成等待处理数据 0:没有采集完成 -//=================================================声明 定位模块 全局变量================================================ - - -//=================================================声明 定位模块 基础函数================================================ -double get_two_points_distance (double lat1, double lng1, double lat2, double lng2); // 计算从第一个点到第二个点的距离(单位:m) -double get_two_points_azimuth (double lat1, double lon1, double lat2, double lon2); // 计算从第一个点到第二个点的方位角(单位:°) -uint8 gps_data_parse (void); // 解析GPS数据 -void gps_uart_callback (void); // GPS回调函数 -void gps_init (void); // GPS初始化 -//=================================================声明 定位模块 基础函数================================================ -#endif diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_icm20602.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_icm20602.c index f4ae830..ddebf3c 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_icm20602.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_icm20602.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_icm20602 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_icm20602.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_icm20602.h index 67724ad..209972b 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_icm20602.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_icm20602.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_icm20602 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_imu660ra.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_imu660ra.c index 95144f9..02fdb9e 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_imu660ra.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_imu660ra.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu660ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_imu660ra.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_imu660ra.h index a689df1..348e6a1 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_imu660ra.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_imu660ra.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu660ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_imu963ra.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_imu963ra.c index 92ec0f6..595142a 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_imu963ra.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_imu963ra.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu963ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_imu963ra.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_imu963ra.h index 4d0d9f9..c0f981f 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_imu963ra.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_imu963ra.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu963ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_ips114.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_ips114.c index 78c6f3b..b13e338 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_ips114.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_ips114.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips114 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_ips114.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_ips114.h index 81dfc3c..ba932b1 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_ips114.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_ips114.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips114 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_ips200.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_ips200.c index cd8681f..37d9d04 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_ips200.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_ips200.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips200 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_ips200.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_ips200.h index ce59927..045bf27 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_ips200.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_ips200.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips200 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_key.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_key.c index 9e42c8a..8b240cb 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_key.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_key.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_key * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_key.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_key.h index bcab8aa..9c653cf 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_key.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_key.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_key * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_mpu6050.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_mpu6050.c index dc3c5b2..101a5ae 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_mpu6050.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_mpu6050.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_mpu6050 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_mpu6050.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_mpu6050.h index 3510e06..c8a086f 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_mpu6050.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_mpu6050.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_mpu6050 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_mt9v03x.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_mt9v03x.c index 231cfec..d38b8df 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_mt9v03x.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_mt9v03x.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_mt9v03x * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_mt9v03x.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_mt9v03x.h index 7786bc5..9d4650d 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_mt9v03x.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_mt9v03x.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_mt9v03x * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_oled.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_oled.c index 5314209..55aefa7 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_oled.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_oled.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_oled * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_oled.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_oled.h index d52d2fd..aadf048 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_oled.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_oled.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_oled * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_ov7725.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_ov7725.c index 12f6095..bac95fe 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_ov7725.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_ov7725.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ov7725 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_ov7725.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_ov7725.h index f45a4e8..2cb4026 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_ov7725.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_ov7725.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ov7725 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_scc8660.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_scc8660.c index 3483c93..38d65ff 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_scc8660.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_scc8660.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_scc8660 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_scc8660.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_scc8660.h index 815d272..537283a 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_scc8660.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_scc8660.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_scc8660 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_tft180.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_tft180.c index db50824..b661e91 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_tft180.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_tft180.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_tft180 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_tft180.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_tft180.h index 47491ee..54a72b3 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_tft180.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_tft180.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_tft180 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_tsl1401.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_tsl1401.c index 3f9db7f..d133c7c 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_tsl1401.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_tsl1401.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_tsl1401 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_tsl1401.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_tsl1401.h index 1fab12e..a7b061c 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_tsl1401.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_tsl1401.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_tsl1401 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_type.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_type.c index 497ba55..af24701 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_type.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_type.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_type * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -32,6 +32,7 @@ * 日期 作者 备注 * 2022-09-15 pudding first version * 2023-05-26 pudding 新增SPI WIFI 中断回调指针 +* 2024-01-16 pudding 移除SPI WIFI 中断回调指针 SPI WIFI将不再使用外部 ********************************************************************************************************************/ #include "zf_device_type.h" @@ -45,7 +46,6 @@ callback_function camera_dma_handler = type_default_callback; wireless_type_enum wireless_type = NO_WIRELESS; callback_function wireless_module_uart_handler = type_default_callback; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 -callback_function wireless_module_spi_handler = type_default_callback; // WIFI SPI GPIO中断函数指针,根据初始化时设置的函数进行跳转 tof_type_enum tof_type = NO_TOF; callback_function tof_module_exti_handler = type_default_callback; // ToF 模块 INT 更新中断 @@ -54,7 +54,7 @@ callback_function tof_module_exti_handler = type_default_callback; // 函数简介 默认回调函数 // 参数说明 void // 返回参数 void -// 使用示例 +// 使用示例 // 备注信息 保护性冗余设计 防止在没有初始化设备的时候跑飞 //------------------------------------------------------------------------------------------------------------------- static void type_default_callback (void) @@ -90,14 +90,7 @@ void set_camera_type (camera_type_enum type_set, callback_function vsync_callba void set_wireless_type (wireless_type_enum type_set, callback_function wireless_callback) { wireless_type = type_set; - if(WIFI_SPI == wireless_type) - { - wireless_module_spi_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); - } - else - { - wireless_module_uart_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); - } + wireless_module_uart_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); } //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_type.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_type.h index 19c36ca..3b124fe 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_type.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_type.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_type * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -56,7 +56,6 @@ typedef enum WIRELESS_UART, // 无线串口 BLUETOOTH_CH9141, // 蓝牙 CH9141 WIFI_UART, // 串口 WiFi - WIFI_SPI // SPI WiFi }wireless_type_enum; typedef enum diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c index 2bdb164..3cbc786 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_virtual_oscilloscope * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h index f518026..b0fd085 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_virtual_oscilloscope * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_wifi_spi.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_wifi_spi.c index 78a6d68..f9e51ca 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_wifi_spi.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_wifi_spi.c @@ -24,14 +24,13 @@ * 文件名称 zf_device_wifi_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 * 日期 作者 备注 -* 2023-05-27 pudding first version -* 2023-05-29 pudding 新增关闭休眠指令,提升通讯效率 +* 2022-09-21 SeekFree first version ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,1374 +52,615 @@ #include "zf_common_clock.h" #include "zf_common_debug.h" #include "zf_common_fifo.h" -#include "zf_common_function.h" #include "zf_driver_delay.h" #include "zf_driver_gpio.h" -#include "zf_common_interrupt.h" -#include "zf_driver_exti.h" #include "zf_driver_spi.h" #include "zf_device_type.h" #include "zf_device_wifi_spi.h" -#define WAIT_TIME_OUT (10000) // 单指令等待时间 单位:ms +#define WIFI_CONNECT_TIME_OUT 10000 // 单位毫秒 +#define SOCKET_CONNECT_TIME_OUT 50000 // 单位毫秒 +#define OTHER_TIME_OUT 1000 // 单位毫秒 -#define WIFI_SPI_WRITE_MAX 128 // 定义一次SPI通讯最大发送的数据长度 - -#define WIFI_SPI_WRITE_REQUEST 0x01 -#define WIFI_SPI_CHECK_STATE 0x02 -#define WIFI_SPI_WRITE_DATA 0x03 -#define WIFI_SPI_READ_DATA 0x04 -#define WIFI_SPI_WRITE_END 0x07 -#define WIFI_SPI_READ_END 0x08 - -#define WIFI_SPI_WRITE_ADDR 0x00 -#define WIFI_SPI_STATE_ADDR 0x04 +char wifi_spi_version[12]; // 保存模块固件版本信息 +char wifi_spi_mac_addr[20]; // 保存模块MAC地址信息 +char wifi_spi_ip_addr_port[25]; // 保存模块IP地址与端口信息 -volatile wifi_spi_buffer_state_enum wifi_buffer_state; -volatile wifi_spi_transmit_state_enum wifi_transmit_state; - -static fifo_obj_struct wifi_spi_fifo; -static uint8 wifi_spi_buffer[WIFI_SPI_BUFFER_SIZE]; // 数据存放数组 - -vuint8 wifi_spi_ack_flag = 0; // 0:模块未应答 1:模块已应答 -uint8 wifi_spi_init_flag; // 0:模块未初始化成功或者未连接 1:模块已连接并成功初始化 -vuint8 wifi_spi_packet_num; // 发送的数据包ID -vuint32 wifi_spi_send_remain_length; // 剩余的发送长度 - - - -wifi_spi_information_struct wifi_spi_information; +static fifo_struct wifi_spi_fifo; +static uint8 wifi_spi_buffer[WIFI_SPI_RECVIVE_FIFO_SIZE]; +static volatile wifi_spi_state_enum wifi_spi_mutex; //------------------------------------------------------------------------------------------------------------------- -// 函数简介 请求写入数据到模块 -// 参数说明 length 需要写入的长度 -// @return void -// Sample usage: +// 函数简介 等待WIFI SPI就绪 +// 参数说明 wait_time 最大等待时间 单位毫秒 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_write_request(uint16 length) +static uint8 wifi_spi_wait_idle (uint32 wait_time) { - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_REQUEST; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - head.magic = 0xFE; - head.sequence = wifi_spi_packet_num++; - head.length = length; + uint32 time = 0; - wifi_transmit_state = TRANSMIT_WRITE_REQUEST; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 7); - gpio_set_level(WIFI_SPI_CS_PIN, 1); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 读取模块状态 -// 参数说明 *length 需要读取或者写入的长度 -// @return WIFI_SPI_BUFFER_STATE_enum 模块状态 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static wifi_spi_buffer_state_enum wifi_spi_read_state(uint16 *length) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_CHECK_STATE; - head.addr = WIFI_SPI_STATE_ADDR; - head.dummy = 0x00; - - wifi_spi_ack_flag = 0; - wifi_transmit_state = TRANSMIT_READ_STATE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_transfer_8bit(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, &head.cmd, 7); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - - if(BUFFER_WRITE == head.magic) + wait_time = wait_time*100; + while(0 == gpio_get_level(WIFI_SPI_INT_PIN)) { - wifi_spi_packet_num = head.sequence; - } - *length = head.length; - - return (wifi_spi_buffer_state_enum)head.magic; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据发送完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_done(void) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_END; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_transmit_state = TRANSMIT_IDLE; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据接收完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_start(void) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_READ_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - wifi_transmit_state = TRANSMIT_READ; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据接收完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_done(void) -{ - wifi_spi_buffer_struct head; - - gpio_set_level(WIFI_SPI_CS_PIN, 1); - - head.cmd = WIFI_SPI_READ_END; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_transmit_state = TRANSMIT_IDLE; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块 -// 参数说明 *buff 需要写入数据的首地址 -// 参数说明 length 需要写入数据的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_data(const uint8 *buff, uint16 length) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - wifi_transmit_state = TRANSMIT_WRITE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - spi_write_8bit_array(WIFI_SPI_INDEX, buff, length); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_spi_send_done(); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_data_multi(wifi_spi_send_multi_struct *multi_buffer) -{ - uint8 i; - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - wifi_transmit_state = TRANSMIT_WRITE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - - for(i = 0; i < WIFI_SPI_MAX_MULTI; i++) - { - if(NULL != multi_buffer->source[i]) spi_write_8bit_array(WIFI_SPI_INDEX, multi_buffer->source[i], multi_buffer->length[i]); - } - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_spi_send_done(); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 接收模块发送的数据 -// 参数说明 *buff 接收数组的缓冲区首地址 -// 参数说明 length 需要接收的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_data(uint8 *buff, uint16 length) -{ - spi_read_8bit_array(WIFI_SPI_INDEX, buff, length); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送命令到模块 -// 参数说明 *str 命令字符串首地址 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_command(const char *str) -{ - uint8 state = 0; - uint16 send_length; - uint16 wait_time = 0; - - // 请求发送数据 - send_length = (uint16)strlen(str); - - // 等待传输进入空闲 - while(TRANSMIT_IDLE != wifi_transmit_state); - - // 如果没有进入发送状态则重新请求发送数据 - while(BUFFER_WRITE != wifi_buffer_state) - { - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - while(!wifi_spi_ack_flag) - { - wait_time++; - if((WAIT_TIME_OUT / 4) <= wait_time) - { - state = 1; - wifi_spi_init_flag = 0; // 模块已断开 - break; - } - system_delay_ms(1); - } - - if(1 == state) + system_delay_us(10); + time++; + if(wait_time <= time) { break; } } - - wifi_buffer_state = BUFFER_IDLE; - - if(0 == state) // 通讯未超时 - { - wifi_spi_send_remain_length = send_length; - // 发送消息 - wifi_spi_send_data((const uint8 *)str, send_length); - } + return (wait_time <= time); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 检查模块状态并读取模块发送的数据 -// 参数说明 void -// @return void -// Sample usage: +// 函数简介 写入数据到WIFI SPI +// 参数说明 *buffer1 第一组需要发送的数据缓冲区地址 +// 参数说明 length1 第一组数据长度 +// 参数说明 *buffer2 第二组需要发送的数据缓冲区地址 +// 参数说明 length2 第二组数据长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -void wifi_spi_check_state_read_buffer(void) +static void wifi_spi_write (const uint8 *buffer1, uint16 length1, const uint8 *buffer2, uint16 length2) { - uint16 wifi_spi_receive_length; // 本次接收到的数据数量 - uint8 wifi_spi_receive_buffer[WIFI_SPI_WRITE_MAX]; - - // 查询WIFI模块的状态 - wifi_buffer_state = wifi_spi_read_state(&wifi_spi_receive_length); - - // 如果需要读取WIFI模块数据,则保存需要读取的长度 - if(BUFFER_READ == wifi_buffer_state) + gpio_low(WIFI_SPI_CS_PIN); + if(NULL != buffer1) { - wifi_spi_receive_start(); - do - { - if(wifi_spi_receive_length > WIFI_SPI_WRITE_MAX) - { - wifi_spi_receive_data((uint8 *)wifi_spi_receive_buffer, WIFI_SPI_WRITE_MAX); - fifo_write_buffer(&wifi_spi_fifo, wifi_spi_receive_buffer, WIFI_SPI_WRITE_MAX); // 存入 FIFO - wifi_spi_receive_length = wifi_spi_receive_length - WIFI_SPI_WRITE_MAX; - } - else - { - wifi_spi_receive_data((uint8 *)wifi_spi_receive_buffer, wifi_spi_receive_length); - fifo_write_buffer(&wifi_spi_fifo, wifi_spi_receive_buffer, wifi_spi_receive_length); // 存入 FIFO - wifi_spi_receive_length = 0; - } - }while(wifi_spi_receive_length > 0); - wifi_spi_receive_done(); + spi_write_8bit_array(WIFI_SPI_INDEX, buffer1, length1); } - else if(BUFFER_IDLE == wifi_buffer_state) + if(NULL != buffer2) { - // 如果模块内部缓冲区状态为空闲,则传输状态也设置为空闲 - wifi_transmit_state = TRANSMIT_IDLE; + spi_write_8bit_array(WIFI_SPI_INDEX, buffer2, length2); } + gpio_high(WIFI_SPI_CS_PIN); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块 -// 参数说明 *buff 需要发送的数据首地址 -// 参数说明 length 需要发送的长度 -// @return uint32 剩余未发送长度 -// Sample usage: +// 函数简介 WIFI SPI 发送与接收同时进行(命令收发) +// 参数说明 *packets 发送与接收的地址 +// 参数说明 length 需要接收的长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_write_data(const uint8 *buff, uint32 length) +static void wifi_spi_transfer_command (wifi_spi_packets_struct *packets, uint16 length) { - uint16 send_length; - uint32 wait_time; + gpio_low(WIFI_SPI_CS_PIN); - // 记录需要发送的长度 - wifi_spi_send_remain_length = length; - - while(wifi_spi_send_remain_length) + spi_transfer_8bit(WIFI_SPI_INDEX, (uint8 *)&(packets->head), (uint8 *)&(packets->head), sizeof(wifi_spi_head_struct)); + + if(length) { - send_length = (uint16)func_limit_ab(wifi_spi_send_remain_length, 1, WIFI_SPI_WRITE_MAX); - - // 请求发送数据 - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - - // 最长等待5秒 - wait_time = 5000; - while(!wifi_spi_ack_flag) - { - wait_time--; - if(0 == wait_time) break; - system_delay_ms(1); - } - - if(BUFFER_WRITE == wifi_buffer_state) - { - // 发送消息 - wifi_spi_send_data(buff, send_length); - buff += send_length; - wifi_spi_send_remain_length -= send_length; - wifi_buffer_state = BUFFER_IDLE; - } - else - { - break; - } + spi_transfer_8bit(WIFI_SPI_INDEX, (const uint8 *)(packets->buffer), packets->buffer, length); } - - return wifi_spi_send_remain_length; + + gpio_high(WIFI_SPI_CS_PIN); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// @return uint32 剩余未发送长度 -// Sample usage: 发送数据总长度不能超过4092个 +// 函数简介 WIFI SPI 发送与接收同时进行(数据收发) +// 参数说明 *write_data 发送的数据缓冲区地址 +// 参数说明 *read_data 接收到的数据的存储地址 +// 参数说明 length 需要接收的长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_write_data_multi(wifi_spi_send_multi_struct *multi_buffer) +static void wifi_spi_transfer_data (const uint8 *write_data, wifi_spi_packets_struct *read_data, uint16 length) { - uint16 send_length; - uint32 wait_time; + gpio_low(WIFI_SPI_CS_PIN); - // 记录需要发送的长度 - send_length = multi_buffer->length[0] + multi_buffer->length[1] + multi_buffer->length[2] + multi_buffer->length[3] + multi_buffer->length[4] + multi_buffer->length[5] + multi_buffer->length[6] + multi_buffer->length[7]; + read_data->head.command = WIFI_SPI_DATA; + read_data->head.length = length; - if(WIFI_SPI_WRITE_MAX >= send_length) + spi_transfer_8bit(WIFI_SPI_INDEX, (uint8 *)&(read_data->head), (uint8 *)&(read_data->head), sizeof(wifi_spi_head_struct)); + + if(WIFI_SPI_RECVIVE_SIZE < length) { - // 请求发送数据 - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - - // 最长等待5秒 - wait_time = 5000; - while(!wifi_spi_ack_flag) - { - wait_time--; - if(0 == wait_time) break; - system_delay_ms(1); - } - - if(BUFFER_WRITE == wifi_buffer_state) - { - // 发送消息 - wifi_spi_send_data_multi(multi_buffer); - send_length = 0; - wifi_buffer_state = BUFFER_IDLE; - } + spi_transfer_8bit(WIFI_SPI_INDEX, write_data, read_data->buffer, WIFI_SPI_RECVIVE_SIZE); + spi_write_8bit_array(WIFI_SPI_INDEX, &write_data[WIFI_SPI_RECVIVE_SIZE], length - WIFI_SPI_RECVIVE_SIZE); } - - return send_length; + else + { + // 将需要发送的数据拷贝到读取缓冲区,避免出现write_data越界访问 + memcpy(read_data->buffer, write_data, length); + spi_transfer_8bit(WIFI_SPI_INDEX, read_data->buffer, read_data->buffer, WIFI_SPI_RECVIVE_SIZE); + } + gpio_high(WIFI_SPI_CS_PIN); } -//-------------------------------------------------------------------------------------------------- -// 函数简介 等待模块响应 -// 参数说明 *wait_buffer 等待的响应的字符串 -// 参数说明 timeout 超时时间 -// 返回参数 uint8 0:模块响应指定数据 1:模块未响应指定数据或超时 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_wait_ack (char *wait_buffer, uint32 timeout) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 参数设置 +// 参数说明 command 命令类型 +// 参数说明 *buffer 参数地址 +// 参数说明 length 参数长度 +// 参数说明 wait_time 最大等待时间 单位100微妙 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_set_parameter (wifi_spi_packets_command_enum command, uint8 *buffer, uint16 length, uint32 wait_time) { - uint8 return_state = 1; - char receiver_buffer[8] = {0, 0, 0, 0, 0, 0, 0, 0}; - uint32 receiver_len = 8; - + uint8 return_state; + wifi_spi_head_struct head; + return_state = 1; do { - system_delay_ms(1); - // 判断接收缓冲区内是否有需要响应的指定数据 如果有 则跳出循环并且返回0 - receiver_len = 8; - fifo_read_tail_buffer(&wifi_spi_fifo, (uint8 *)receiver_buffer, &receiver_len, FIFO_READ_ONLY); + head.command = command; + head.length = length; + + // 等待从机准备就绪 + if(wifi_spi_wait_idle(wait_time)) + { + break; + } - if(strstr(receiver_buffer, wait_buffer)) + wifi_spi_write(&head.command, sizeof(wifi_spi_head_struct), buffer, length); + if(wifi_spi_wait_idle(wait_time)) + { + break; + } + // 接收应答信号 + + head.command = WIFI_SPI_DATA; + head.length = 0; + wifi_spi_transfer_command((wifi_spi_packets_struct *)&head, head.length); + system_delay_us(20); + if(WIFI_SPI_REPLY_OK == head.command) { return_state = 0; - break; } - else if(strstr(receiver_buffer, "ERROR") || strstr(receiver_buffer, "busy")) - { - // 如果接收到报错或者模块忙 则跳出循环并且返回1 - return_state = 1; - break; - } - }while(timeout --); + }while(0); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 清除WiFi接收缓冲区内容 -// 参数说明 void -// 返回参数 void -// 使用示例 wifi_spi_clear_receive_buffer(); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static void wifi_spi_clear_receive_buffer (void) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 模块信息获取 +// 参数说明 command 命令类型 +// 参数说明 *buffer 保存接收到的参数地址 +// 参数说明 wait_time 最大等待时间 单位100微妙 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_parameter (wifi_spi_packets_command_enum command, wifi_spi_packets_struct *read_data, uint32 wait_time) { - // 清空WiFi接收缓冲区 - fifo_clear(&wifi_spi_fifo); -} + uint8 return_state; -//-------------------------------------------------------------------------------------------------- -// 函数简介 模块数据解析 -// 参数说明 *target_buffer 目标存放地址指针 字符串数组 -// 参数说明 *origin_buffer 数据来源地址指针 字符串数组 -// 参数说明 start_char 起始提取字节 例如从 "1234" 中从 '2' 开始提取 就应该填入 '2' -// 参数说明 end_char 结束提取字节 例如从 "1234" 中在 '4' 结束提取 就应该填入 '\0'(0x00 空字符 一般是字符串结尾) -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_data_parse(wifi_spi_information.mac, wifi_spi_receive_buffer, '"', '"'); // 调用获取本机mac地址后,调用此函数提取mac地址 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char start_char, char end_char) -{ - uint8 return_state = 0; - char *location1; - char *location2; - location1 = strchr((char *)origin_buffer, start_char); - if(location1) + return_state = 1; + do { - location1 ++; - location2 = strchr(location1, end_char); - if(location2) + // 等待从机准备就绪 + if(wifi_spi_wait_idle(wait_time)) { - memcpy(target_buffer, location1, location2-location1); + break; } - else + read_data->head.command = command; + wifi_spi_write(&(read_data->head.command), WIFI_SPI_RECVIVE_SIZE, NULL, 0); + + if(wifi_spi_wait_idle(wait_time)) { - return_state = 1; + break; } - } - else - { - return_state = 1; - } + read_data->head.command = WIFI_SPI_DATA; + read_data->head.length = 0; + wifi_spi_transfer_command(read_data, WIFI_SPI_RECVIVE_SIZE); + return_state = 0; + }while(0); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 查看模块版本信息 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_get_version(); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 固件版本获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,固件版本信息以字符串形式保存在wifi_spi_version数组中 +//------------------------------------------------------------------------------------------------------------------- static uint8 wifi_spi_get_version (void) { - char *location1; - uint8 return_state = 0; - uint8 receiver_buffer[256]; - uint32 receiver_len = 256; + uint8 return_state; + wifi_spi_packets_struct temp_packets; - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+GMR\r\n"); - do + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_VERSION, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_VERSION == temp_packets.head.command)) { - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - location1 = strrchr((char *)receiver_buffer, ':'); - if(wifi_spi_data_parse(wifi_spi_information.version, (uint8 *)location1, ':', '(')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - + memcpy(wifi_spi_version, temp_packets.buffer, temp_packets.head.length); + } return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 模块回显设置 -// 参数说明 model 0:关闭模块的回写功能 其他:开启模块回写 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_echo_set("1");//开启模块回写功能 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_echo_set (char *model) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI MAC地址获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,MAC地址信息以字符串形式保存在wifi_spi_mac_addr数组中 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_mac_addr (void) { - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - if('1' == *model) + uint8 return_state; + wifi_spi_packets_struct temp_packets; + + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_MAC_ADDR, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_MAC_ADDR == temp_packets.head.command)) { - wifi_spi_send_command("ATE1\r\n"); + memcpy(wifi_spi_mac_addr, temp_packets.buffer, temp_packets.head.length); + } + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI IP地址与端口号获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 +// 需要在连接Socket之后调用此函数才能正常获取信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_ip_addr_port (void) +{ + uint8 return_state; + wifi_spi_packets_struct temp_packets; + + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_IP_ADDR, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_IP_ADDR == temp_packets.head.command)) + { + memcpy(wifi_spi_ip_addr_port, temp_packets.buffer, temp_packets.head.length); + } + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 设置连接的WiFi信息并尝试连接WiFi +// 参数说明 *wifi_ssid WIFI名称 +// 参数说明 *pass_word WIFI密码 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_wifi_connect("SEEKFREE", "SEEKFREE123"); +// 备注信息 wifi_spi_wifi_connect("SEEKFREE", NULL); // 连接没有密码的WIFI热点 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_wifi_connect (char *wifi_ssid, char *pass_word) +{ + uint8 return_state; + uint8 temp_buffer[64]; + uint16 length; + + if(NULL != pass_word) + { + // WIFI热点有密码发送热点名称与密码 + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n%s\r\n", wifi_ssid, pass_word); } else { - wifi_spi_send_command("ATE0\r\n"); + // WIFI热点没有密码只需要发送热点名称 + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n", wifi_ssid); } - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + return_state = wifi_spi_set_parameter(WIFI_SPI_SET_WIFI_INFORMATION, temp_buffer, length, WIFI_CONNECT_TIME_OUT); + + // 本机IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 + wifi_spi_get_ip_addr_port(); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块自身 的 MAC 地址 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_mac()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_mac (void) -{ - uint8 return_state = 0; - uint8 receiver_buffer[64]; - uint32 receiver_len = 64; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPAPMAC?\r\n"); - do - { - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - if(wifi_spi_data_parse(wifi_spi_information.mac, receiver_buffer, '"', '"')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块或者目标WIFI 的 IP 地址(取决于模块当前的工作模式) -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_ip()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_ip (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_STATION == wifi_spi_information.mode) - { - wifi_spi_send_command("AT+CIPSTA?\r\n"); - } - else if(WIFI_SPI_SOFTAP == wifi_spi_information.mode) - { - wifi_spi_send_command("AT+CIPAP?\r\n"); - } - - do - { - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - uint8 receiver_buffer[128]; - uint32 receiver_len = 128; - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - if(wifi_spi_data_parse(wifi_spi_information.local_ip, receiver_buffer, '"', '"')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块的相关信息 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_information()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_information (void) -{ - uint8 return_state = 0; - do - { - // 获取模块版本号 - if(wifi_spi_get_version()) - { - return_state = 1; - break; - } - // 获取模块IP地址 - if(wifi_spi_get_ip()) - { - return_state = 1; - break; - } - // 获取模块MAC信息 - if(wifi_spi_get_mac()) - { - return_state = 1; - break; - } - memcpy(wifi_spi_information.local_port, "no port", 7); - }while(0); - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 连接 WiFi -// 参数说明 wifi_ssid WiFi名称 -// 参数说明 pass_word WiFi密码 -// 参数说明 model 0:查询WiFi连接情况 其他:连接WiFi -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_get_or_connect_wifi("WiFi_name", "Pass_word", 1); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_wifi (char *wifi_ssid, char *pass_word) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SOFTAP == wifi_spi_information.mode) - { - sprintf(temp, "AT+CWSAP=\"%s\",\"%s\",5,3\r\n", wifi_ssid, pass_word); - wifi_spi_send_command(temp); - } - else - { - sprintf(temp, "AT+CWJAP=\"%s\",\"%s\"\r\n", wifi_ssid, pass_word); - wifi_spi_send_command(temp); - } - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 上电是否自动连接WiFi -// 参数说明 model 0:上电不自动连接wifi 其他:上电自动连接wifi -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_auto_connect_wifi(0); //上电不自动连接wifi -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_auto_connect_wifi (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CWAUTOCONN=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置连接模式 -// 参数说明 model 0: 单连接模式 1:多连接模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_connect_model("1"); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_connect_model (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPMUX=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置传输模式 -// 参数说明 model – 0: 普通传输模式 IP断开后不重新连接 -// – 1: Wi-Fi 透传接收模式,仅支持 TCP 单连接、UDP 固定通信对端、SSL 单连接的情况 IP断开后会不断尝试重新连接 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_transfer_model("1"); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_transfer_model (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPMODE=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置模块模式 (Station/SoftAP/Station+SoftAP) -// 参数说明 state 0:无 Wi-Fi 模式,并且关闭 Wi-Fi RF----1: Station 模式----2: SoftAP 模式----3: SoftAP+Station 模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_model("1"); +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 设置连接的Socket信息并尝试连接Socket +// 参数说明 *transport_type 传输类型 +// 参数说明 *ip_addr IP地址 +// 参数说明 *port 目标端口号 +// 参数说明 *local_port 本机端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_socket_connect("TCP", "192.168.2.5", "8080", "6060"); // 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_set_model (wifi_spi_mode_enum mode) +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_socket_connect (char *transport_type, char *ip_addr, char *port, char *local_port) { - uint8 return_state = 0; + uint8 return_state; + uint8 temp_buffer[41]; + uint16 length; + + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n%s\r\n%s\r\n%s\r\n", transport_type, ip_addr, port, local_port); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + return_state = wifi_spi_set_parameter(WIFI_SPI_SET_SOCKET_INFORMATION, temp_buffer, length, SOCKET_CONNECT_TIME_OUT); - if(WIFI_SPI_SOFTAP == mode) - { - wifi_spi_send_command("AT+CWMODE=2\r\n"); - } - else - { - wifi_spi_send_command("AT+CWMODE=1\r\n"); - } - // 设置模块工作模式 - wifi_spi_information.mode = mode; - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + // 本机IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 + wifi_spi_get_ip_addr_port(); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 关闭睡眠模式 -// 参数说明 mode -// 返回参数 uint8 0:成功 1:失败 +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 断开Socket连接 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_socket_disconnect(); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_socket_disconnect (void) +{ + wifi_spi_packets_struct temp_packets; + + return wifi_spi_get_parameter(WIFI_SPI_CLOSE_SOCKET, &temp_packets, OTHER_TIME_OUT); +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 软复位 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 // 使用示例 // 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_close_sleep_model (void) +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_reset (void) { - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+SLEEP=0\r\n"); - // 设置模块工作模式 - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 断开与wifi的连接 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_disconnected_wifi(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_disconnected_wifi (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CWQAP\r\n"); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 进入打开透传模式 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_entry_serianet(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_entry_serianet (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPSEND\r\n"); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 退出透传模式 -// 参数说明 model 0:关闭透传模式 其他:开启透传模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_exit_serianet(1); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_exit_serianet (void) -{ - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - system_delay_ms(20); - wifi_spi_send_command("+++"); - system_delay_ms(1000); - - return 0; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 建立TCP连接 -// 参数说明 ip 远端 IPv4 地址、IPv6 地址,或域名 -// 参数说明 port 远端端口值 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_connect_tcp_servers("192.168.101.110", "8080"); -// 备注信息 如果总是连接不上电脑的TCP服务器 可以尝试使用网线连接电脑 -// 如果是使用WiFi连接 可能会导致模块连接TCP服务器等待较长时间 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_connect_tcp_servers (char *ip, char *port, wifi_spi_transfer_mode_enum mode) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + uint8 return_state; + wifi_spi_head_struct head; + return_state = 1; do { - if(wifi_spi_set_connect_model("0")) + head.command = WIFI_SPI_RESET; + head.length = 0xA5A5; + return_state = wifi_spi_wait_idle(OTHER_TIME_OUT); + if(return_state) { - return_state = 1; break; } + wifi_spi_write(&head.command, sizeof(wifi_spi_head_struct), NULL, 0); + }while(0); + + return return_state; +} - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPSTARTEX=\"TCP\",\"%s\",%s\r\n", ip, port); - wifi_spi_send_command(temp); - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI UDP模式时立即发送函数 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 在UDP模式下模块收到数据后会等待2毫秒,2毫秒后未收到数据则将数据通过socket发送到网络,如果希望立即发送则在数据传输完毕后调用此函数 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_udp_send_now (void) +{ + uint8 return_state = 1; + wifi_spi_packets_struct temp_packets; + + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + do { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - // 设置传输模式 - if(wifi_spi_set_transfer_model(WIFI_SPI_COMMAND == mode ? "0" : "1")) - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPSTATE?\r\n"); - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - else - { - uint8 receiver_buffer[128]; - uint32 receiver_len = 128; - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - char* buffer_index = (char *)receiver_buffer; - char* end_index; - - buffer_index += 22; - buffer_index += strlen(ip); - buffer_index += strlen(port); - end_index = strchr(buffer_index, ','); - - memcpy(wifi_spi_information.local_port, " ", 7); - memcpy(wifi_spi_information.local_port, buffer_index, (end_index - buffer_index)); - } - - wifi_spi_information.connect_state = WIFI_SPI_SERVER_ON; - wifi_spi_information.connect_mode = WIFI_SPI_TCP_CLIENT; - wifi_spi_information.transfer_mode = mode; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SERIANET == mode) // 透传模式下直接开启透传 - { - if(wifi_spi_entry_serianet()) + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) { - return_state = 1; break; } - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 建立UDP连接 -// 参数说明 *ip 远端 IPv4 地址、IPv6 地址 或域名 字符串形式 -// 参数说明 *port 远端端口值 字符串形式 -// 参数说明 *local_port 远端 IPv4 地址、IPv6 地址 或域名 字符串形式 -// 参数说明 mode 模块数据通信模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_connect_udp_client("192.168.101.110", "8080", "8080", WIFI_SPI_COMMAND); -// 备注信息 自动分配ID -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_connect_udp_client (char *ip, char *port, char *local_port, wifi_spi_transfer_mode_enum mode) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - do - { - if(wifi_spi_set_connect_model("0")) - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + // 立即开始socket发送 + temp_packets.head.command = WIFI_SPI_UDP_SEND; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + + // 等待应答信号 + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + + // 接收应答信号 + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, temp_packets.head.length); + + if(WIFI_SPI_REPLY_OK == temp_packets.head.command) + { + return_state = 0; + } + + }while(0); - sprintf(temp, "AT+CIPSTARTEX=\"UDP\",\"%s\",%s,%s\r\n", ip, port, local_port); - wifi_spi_send_command(temp); + // 将通讯状态设置为空闲 + wifi_spi_mutex = WIFI_SPI_IDLE; + } + + return return_state; +} - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 数据块发送函数并同步接收数据 +// 参数说明 *buff 需要发送的数据地址 +// 参数说明 length 发送长度 +// 返回参数 uint32 剩余未发送的长度 +// 使用示例 wifi_spi_send_buffer(buffer, 100); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +uint32 wifi_spi_send_buffer (const uint8 *buffer, uint32 length) +{ + uint16 send_length; + wifi_spi_packets_struct temp_packets; + + // 检查WIFI SPI状态,如果在其他中断或者线程中已经发起了通讯,则本次不能发送数据 + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + + while(length) { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_spi_set_transfer_model(WIFI_SPI_COMMAND == mode ? "0" : "1")) // 设置传输模式 - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SERIANET == mode) // 透传模式下直接开启透传 - { - if(wifi_spi_entry_serianet()) + send_length = length > WIFI_SPI_TRANSFER_SIZE ? (uint16)WIFI_SPI_TRANSFER_SIZE : (uint16)length; + + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) { - return_state = 1; break; } - } - memcpy(wifi_spi_information.local_port, " ", 7); - memcpy(wifi_spi_information.local_port, local_port, strlen(local_port)); - wifi_spi_information.connect_state = WIFI_SPI_SERVER_ON; - wifi_spi_information.connect_mode = WIFI_SPI_UDP_CLIENT; - wifi_spi_information.transfer_mode = mode; - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 断开连接 TCP Server 使用本接口将会断开所有连接 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_disconnect_link(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_disconnect_link (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - do - { - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - wifi_spi_send_command("AT+CIPCLOSE=5\r\n"); - } - else - { - wifi_spi_send_command("AT+CIPCLOSE\r\n"); - } - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送字节函数 -// 参数说明 data 需要发送的数据 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_byte(0xa5); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_byte (uint8 data) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - send_length = 1; - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data(&data, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else - { - send_length = (uint16)wifi_spi_write_data(&data, send_length); - } - } - } - - return send_length; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送缓冲区函数 -// 参数说明 buff 需要发送的数据地址 -// 参数说明 len 发送长度 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_buffer("123", 3); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 len) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - while(len) - { - if((WIFI_SPI_WRITE_MAX * 2) < len) send_length = WIFI_SPI_WRITE_MAX * 2; - else - { - send_length = (uint16)len; - } - len -= send_length; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data(buff, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } - buff += send_length; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else - { - len = wifi_spi_write_data(buff, len); - } - } - } - - return len; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送缓冲区函数(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 -// 备注信息 需要发送多个数组时,采用此函数可以极大的降低通讯时间,发送数据总长度不能超过4092 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_buffer_multi (wifi_spi_send_multi_struct *multi_buffer) -{ - uint8 i; - uint16 remain_length; - - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - for(i = 0; i < WIFI_SPI_MAX_MULTI; i++) - { - if(multi_buffer->source[i]) wifi_spi_send_buffer(multi_buffer->source[i], multi_buffer->length[i]); - } - } - else - { - remain_length = (uint16)wifi_spi_write_data_multi(multi_buffer); - } - } - } - - return remain_length; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送字符串函数 -// 参数说明 *str 需要发送的数据 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_string("123"); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_string (const char *str) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - send_length = (uint16)strlen(str); - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data((uint8 *)str, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } + wifi_spi_transfer_data(buffer, &temp_packets, send_length); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) { - send_length = (uint16)wifi_spi_write_data((uint8 *)str, send_length); + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + + length -= send_length; + buffer += send_length; + } + + // 检查最后一次的接收是否将所有的数据都接收完毕 + while(WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) + { + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + + // 继续读取模块剩余数据 + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } } } + wifi_spi_mutex = WIFI_SPI_IDLE; } - - return send_length; + return length; } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi 模块数据接收函数 -// 参数说明 buffer 接收数据的存放地址 -// 参数说明 len 数组长度,可直接填写或者使用sizeof求得 -// 返回参数 uint32 返回实际接收到的数据长度 -// 使用示例 uint8 test_buffer[256]; wifi_spi_read_buffer(&test_buffer[0], sizeof(test_buffer)); +// 函数简介 WIFI SPI 读取缓冲区 +// 参数说明 *buff 接收缓冲区 +// 参数说明 length 读取数据长度 +// 返回参数 uint32 实际读取数据长度 +// 使用示例 wifi_spi_read_buffer(buffer, 100); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 len) +uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 length) { - fifo_read_buffer(&wifi_spi_fifo, buffer, &len, FIFO_READ_AND_CLEAN); - return len; + zf_assert(NULL != buffer); + uint32 data_len = length; + +#if(1 == WIFI_SPI_READ_TRANSFER) + + wifi_spi_packets_struct temp_packets; + // 检查WIFI SPI状态,如果在其他中断或者线程中已经发起了通讯,则本次不能发送数据 + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + + // 发起通讯查看模块内是否有数据未读取 + do + { + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + }while(WIFI_SPI_REPLY_DATA_START == temp_packets.head.command); + wifi_spi_mutex = WIFI_SPI_IDLE; + } +#endif + + fifo_read_buffer(&wifi_spi_fifo, buffer, &data_len, FIFO_READ_AND_CLEAN); + return data_len; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 wifi spi handshake中断回调函数 -// 参数说明 void -// 返回参数 void -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -void wifi_spi_callback (void) -{ - wifi_spi_check_state_read_buffer(); - wifi_spi_ack_flag = 1; // ACK标志位置1 -} - - //------------------------------------------------------------------------------------------------------------------- // 函数简介 WiFi 模块初始化 // 参数说明 *wifi_ssid 目标连接的 WiFi 的名称 字符串形式 // 参数说明 *pass_word 目标连接的 WiFi 的密码 字符串形式 -// 参数说明 wifi_mode 模块的工作模式 参照 zf_device_wireless_spi.h 中 wifi_spi_mode_enum 枚举 // 返回参数 uint8 模块初始化状态 0-成功 1-错误 -// 使用示例 wifi_spi_init("SEEKFREE_2.4G", "SEEKFREEV2", WIFI_UART_STATION); -// 备注信息 初始化会首先设置串口配置,之后会对模块进行基本参数配置 -// 具体的配置信息可以在 zf_device_wireless_spi.h 文件中修改 +// 使用示例 wifi_spi_init("SEEKFREE", "SEEKFREE123"); +// 备注信息 wifi_spi_init("SEEKFREE", NULL); // 连接没有密码的WIFI热点 //------------------------------------------------------------------------------------------------------------------- -uint8 wifi_spi_init (char *wifi_ssid, char *pass_word, wifi_spi_mode_enum wifi_mode) +uint8 wifi_spi_init (char *wifi_ssid, char *pass_word) { uint8 return_state = 0; - uint32 temp_isr; - - spi_init(WIFI_SPI_INDEX, SPI_MODE0, WIFI_SPI_SPEED, WIFI_SPI_SCK_PIN, WIFI_SPI_MOSI_PIN, WIFI_SPI_MISO_PIN, SPI_CS_NULL);//硬件SPI初始化 - set_wireless_type(WIFI_SPI, wifi_spi_callback); - fifo_init(&wifi_spi_fifo, FIFO_DATA_8BIT, wifi_spi_buffer, WIFI_SPI_BUFFER_SIZE); + fifo_init(&wifi_spi_fifo, FIFO_DATA_8BIT, wifi_spi_buffer, WIFI_SPI_RECVIVE_FIFO_SIZE); + spi_init(WIFI_SPI_INDEX, SPI_MODE3, WIFI_SPI_SPEED, WIFI_SPI_SCK_PIN, WIFI_SPI_MOSI_PIN, WIFI_SPI_MISO_PIN, SPI_CS_NULL);//硬件SPI初始化 gpio_init(WIFI_SPI_CS_PIN, GPO, 1, GPO_PUSH_PULL); gpio_init(WIFI_SPI_RST_PIN, GPO, 1, GPO_PUSH_PULL); - - temp_isr = interrupt_global_disable(); - - exti_init(WIFI_SPI_INT_PIN, EXTI_TRIGGER_RISING); - + gpio_init(WIFI_SPI_INT_PIN, GPI, 0, GPI_PULL_DOWN); + + // 复位 gpio_set_level(WIFI_SPI_RST_PIN, 0); - system_delay_ms(50); + system_delay_ms(10); gpio_set_level(WIFI_SPI_RST_PIN, 1); - system_delay_ms(1000); + + // 等待模块初始化 + system_delay_ms(100); + wifi_spi_mutex = WIFI_SPI_IDLE; - exti_flag_clear(WIFI_SPI_INT_PIN); - - interrupt_global_enable(temp_isr); do { - if(wifi_spi_echo_set("0")) // 关闭模块回写 + // 固件版本信息以字符串形式保存在wifi_spi_version数组中 + return_state = wifi_spi_get_version(); + if(return_state) + { + break; + } + + // MAC地址信息以字符串形式保存在wifi_spi_mac_addr数组中 + wifi_spi_get_mac_addr(); + + + return_state = wifi_spi_wifi_connect(wifi_ssid, pass_word); + if(return_state) { - zf_log(0, "exit echo failed"); - return_state = 1; break; } - if(wifi_spi_auto_connect_wifi("0")) // 关闭自动连接 + #if(1 == WIFI_SPI_AUTO_CONNECT) + return_state = wifi_spi_socket_connect("TCP", WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT); + if(return_state) { - zf_log(0, "close auto connect failed"); - return_state = 1; break; } - - if(wifi_spi_set_model(wifi_mode)) // 设置运行模式 + #endif + + #if(2 == WIFI_SPI_AUTO_CONNECT) + return_state = wifi_spi_socket_connect("UDP", WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT); + if(return_state) { - zf_log(0, "set run mode failed"); - return_state = 1; break; } - - if(wifi_spi_close_sleep_model()) // 关闭睡眠模式 - { - zf_log(0, "set sleep mode failed"); - return_state = 1; - break; - } - - if(wifi_spi_set_wifi((char *)wifi_ssid, (char *)pass_word)) // 连接 wifi 或者开启热点 - { - zf_log(0, "wifi set failed"); - return_state = 1; - break; - } - - if(wifi_spi_get_information()) // 模块基本参数获取 - { - zf_log(0, "get module information failed"); - return_state = 1; - break; - } -#if WIFI_SPI_AUTO_CONNECT == 1 - if(wifi_spi_connect_tcp_servers(WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_SERIANET)) // 连接TCP服务器 - { - zf_log(0, "connect TCP server failed"); - return_state = 1; - break; - } -#endif -#if WIFI_SPI_AUTO_CONNECT == 2 - if(wifi_spi_connect_udp_client(WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT, WIFI_SPI_SERIANET)) // 建立UDP连接 - { - zf_log(0, "connect UDP server failed"); - return_state = 1; - break; - } -#endif - // 模块初始化成功 - wifi_spi_init_flag = 1; + #endif }while(0); - + return return_state; } diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_wifi_spi.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_wifi_spi.h index 5e5a025..24e7eb1 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_wifi_spi.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_wifi_spi.h @@ -24,13 +24,13 @@ * 文件名称 zf_device_wifi_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 * 日期 作者 备注 -* 2023-05-27 pudding first version +* 2024-01-18 SeekFree first version ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,128 +53,100 @@ #include "zf_common_typedef.h" + #define WIFI_SPI_INDEX (SPI_3 ) // 定义使用的SPI号 -#define WIFI_SPI_SPEED (30 * 1000 * 1000 ) // 硬件 SPI 速率 +#define WIFI_SPI_SPEED (50 * 1000 * 1000 ) // 硬件 SPI 速率 #define WIFI_SPI_SCK_PIN (SPI3_SCLK_P22_3 ) // 定义SPI_SCK引脚 #define WIFI_SPI_MOSI_PIN (SPI3_MOSI_P22_0 ) // 定义SPI_MOSI引脚 #define WIFI_SPI_MISO_PIN (SPI3_MISO_P22_1 ) // 定义SPI_MISO引脚 IPS没有MISO引脚,但是这里任然需要定义,在spi的初始化时需要使用 #define WIFI_SPI_CS_PIN (P22_2 ) // 定义SPI_CS引脚 采用软件CS引脚 -#define WIFI_SPI_INT_PIN (ERU_CH5_REQ1_P15_8) // 定义中断引脚 +#define WIFI_SPI_INT_PIN (P15_8 ) // 定义握手引脚 #define WIFI_SPI_RST_PIN (P23_1 ) // 定义复位引脚 - - -#define WIFI_SPI_BUFFER_SIZE (1024) // 定义SPI接收的缓冲区大小 -#define WIFI_SPI_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不连接 1-自动连接TCP服务器并进入透传模式 2-自动连接UDP服务器并进入透传模式 3:自动建立TCP服务器 - -#if (WIFI_SPI_AUTO_CONNECT > 2) + +#define WIFI_SPI_RECVIVE_FIFO_SIZE (1024) // 接收FIFO大小 +#define WIFI_SPI_READ_TRANSFER (1) // 在调用wifi_spi_read_buffer 是否尝试发起SPI通讯来检测模块内是否有数据需要读取 1:发起SPI通讯 0:不发起SPI通讯,仅读取FIFO + // 如果应用程序中没有任何的地方调用发送函数,则WIFI_SPI_READ_TRANSFER必须设置为1 + +#define WIFI_SPI_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不自动连接 1-自动连接TCP服务器 2-自动连接UDP + +#if (WIFI_SPI_AUTO_CONNECT > 2) #error "WIFI_SPI_AUTO_CONNECT 的值只能为 [0,1,2]" #else -#define WIFI_SPI_TARGET_IP "192.168.2.28" // 连接目标的 IP +#define WIFI_SPI_TARGET_IP "192.168.137.1" // 连接目标的 IP #define WIFI_SPI_TARGET_PORT "8080" // 连接目标的端口 -#define WIFI_SPI_LOCAL_PORT "8080" // 本机端口 +#define WIFI_SPI_LOCAL_PORT "6666" // 本机的端口 0:随机 可设置范围2048-65535 默认 6666 #endif -#define WIFI_SPI_MAX_MULTI (17) // 多地址发送,最大8个地址 -typedef enum -{ - BUFFER_IDLE, // 模块的缓冲区是空闲的 - BUFFER_READ, // 模块的缓冲区有数据需要读取 - BUFFER_WRITE, // 模块的缓冲区是可写的 -}wifi_spi_buffer_state_enum; +#define WIFI_SPI_RECVIVE_SIZE (32) // 每次SPI传输接收的字节数 不允许修改 +#define WIFI_SPI_TRANSFER_SIZE (4088) // 最大SPI传输接收的字节数 不允许修改 + + typedef enum -{ - TRANSMIT_IDLE, // 当前没有传输 - TRANSMIT_WRITE_REQUEST, // 给模块发送了一个传输请求 - TRANSMIT_READ_STATE, // 读取模块状态 - TRANSMIT_READ, // 正在读取模块内部数据 - TRANSMIT_WRITE, // 正在往模块写入数据 -}wifi_spi_transmit_state_enum; - -typedef enum -{ - WIFI_SPI_STATION, // 设备模式 - WIFI_SPI_SOFTAP, // AP模式 -}wifi_spi_mode_enum; - -typedef enum -{ - WIFI_SPI_COMMAND, // 使用命令的方式发送数据 - WIFI_SPI_SERIANET, // 使用透传的方式发送数据 -}wifi_spi_transfer_mode_enum; - -typedef enum -{ - WIFI_SPI_TCP_CLIENT, // 模块连接TCP服务器 - WIFI_SPI_TCP_SERVER, // 模块作为TCP服务器 - WIFI_SPI_UDP_CLIENT, // 模块启用UDP连接 -}wifi_spi_connect_mode_enum; - -typedef enum -{ - WIFI_SPI_SERVER_OFF, // 模块未连接服务器 - WIFI_SPI_SERVER_ON, // 模块已经连接服务器 -}wifi_spi_connect_state_enum; - -typedef enum -{ - WIFI_SPI_LINK_0, // 模块当前链接 0 - WIFI_SPI_LINK_1, // 模块当前链接 1 - WIFI_SPI_LINK_2, // 模块当前链接 2 - WIFI_SPI_LINK_3, // 模块当前链接 3 - WIFI_SPI_LINK_4, // 模块当前链接 4 -}wifi_spi_link_id_enum; - -typedef struct { - uint8 reserve; - uint8 cmd; - uint8 addr; - uint8 dummy; - uint8 magic; - uint8 sequence; - uint16 length; -}wifi_spi_buffer_struct; + // 主机发送的命令 + WIFI_SPI_INVALID1 = 0x00, // 无效数据包 + WIFI_SPI_RESET = 0x01, // 复位命令 + WIFI_SPI_DATA = 0x02, // 透传数据包 + WIFI_SPI_UDP_SEND = 0x03, // UDP下立即发送命令,默认SPI接收数据后2MS未收到数据自动发送数据 + WIFI_SPI_CLOSE_SOCKET = 0x04, // 断开连接 + + WIFI_SPI_SET_WIFI_INFORMATION = 0x10, // 设置WIFI信息命令 + WIFI_SPI_SET_SOCKET_INFORMATION = 0x11, // 设置SOCKET信息命令 + + WIFI_SPI_GET_VERSION = 0x20, // 获取模块版本 + WIFI_SPI_GET_MAC_ADDR = 0x21, // 获取模块MAC地址 + WIFI_SPI_GET_IP_ADDR = 0x22, // 获取模块IP地址 + + // 从机回传的命令 + WIFI_SPI_REPLY_OK = 0x80, // 从机应答的正确命令 + WIFI_SPI_REPLY_ERROR = 0x81, // 从机应答的错误命令 + + WIFI_SPI_REPLY_DATA_START = 0x90, // 从机回传的数据包,并且还有数据需要主机读取 + WIFI_SPI_REPLY_DATA_END = 0x91, // 从机回传的数据包,数据已读取完毕 + + WIFI_SPI_REPLY_VERSION = 0xA0, // 从机回复固件版本 + WIFI_SPI_REPLY_MAC_ADDR = 0xA1, // 从机回复本机MAC地址等信息 + WIFI_SPI_REPLY_IP_ADDR = 0xA2, // 从机回复本机IP地址、端口号 + WIFI_SPI_INVALID2 = 0xFF // 无效数据包 +}wifi_spi_packets_command_enum; + +typedef enum +{ + WIFI_SPI_IDLE, // 模块空闲,可以进行SPI通讯 + WIFI_SPI_BUSY, // 模块正忙,不可进行SPI通讯 +}wifi_spi_state_enum; + + +typedef struct +{ + uint8 command; // 命令字 + uint8 reserve; // 保留 + uint16 length; // 包有效长度 +}wifi_spi_head_struct; + + +typedef struct +{ + wifi_spi_head_struct head; // 帧头 + uint8 buffer[WIFI_SPI_RECVIVE_SIZE]; // 缓冲区 +}wifi_spi_packets_struct; + + +extern char wifi_spi_version[12]; // 固件版本 字符串 +extern char wifi_spi_mac_addr[20]; // 模块MAC地址 字符串 +extern char wifi_spi_ip_addr_port[25]; // IP地址与端口号 字符串 -typedef struct -{ - uint8 version[12]; // 固件版本 字符串形式 - uint8 mac[20]; // 本机 MAC 地址 字符串形式 - uint8 local_ip[17]; // 本机 IP 地址 字符串形式 - uint8 local_port[10]; // 本机端口号 字符串形式 - uint8 remote_ip[5][17]; // 远端 IP 地址 字符串形式 - wifi_spi_mode_enum mode; // WIFI 模式 - wifi_spi_transfer_mode_enum transfer_mode; // 当前传输模式 - wifi_spi_connect_mode_enum connect_mode; // 网络连接模式 - wifi_spi_connect_state_enum connect_state; // 服务器连接情况 -}wifi_spi_information_struct; +uint8 wifi_spi_wifi_connect (char *wifi_ssid, char *pass_word); +uint8 wifi_spi_socket_connect (char *transport_type, char *ip_addr, char *port, char *local_port); +uint8 wifi_spi_socket_disconnect (void); +uint8 wifi_spi_udp_send_now (void); +uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 length); +uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 length); -typedef struct -{ - uint8 *source[WIFI_SPI_MAX_MULTI]; - uint16 length[WIFI_SPI_MAX_MULTI]; -}wifi_spi_send_multi_struct; - -extern wifi_spi_information_struct wifi_spi_information; - - -uint8 wifi_spi_disconnected_wifi (void); // 断开 WIFI 连接 -uint8 wifi_spi_entry_serianet (void); // 打开透传模式 -uint8 wifi_spi_exit_serianet (void); // 关闭透传模式 - -uint8 wifi_spi_connect_tcp_servers (char *ip, char *port, wifi_spi_transfer_mode_enum mode); // 建立 TCP 连接 -uint8 wifi_spi_connect_udp_client (char *ip, char *port, char *local_port, wifi_spi_transfer_mode_enum mode); // 建立 UDP 传输 -uint8 wifi_spi_disconnect_link (void); // 断开连接 TCP Server 使用本接口将会断开所有连接 - -uint32 wifi_spi_send_byte (uint8 data); // WIFI 模块发送字节函数 -uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 length); // WIFI 模块发送缓冲区函数 -uint32 wifi_spi_send_buffer_multi (wifi_spi_send_multi_struct *multi_buffer); // WIFI 模块发送多缓冲区函数 -uint32 wifi_spi_send_string (const char *str); // WIFI 模块发送字符串函数 - -uint32 wifi_spi_read_buffer (uint8 *buff, uint32 len); // WIFI 模块数据接收函数 - -uint8 wifi_spi_init (char *wifi_ssid, char *pass_word, wifi_spi_mode_enum wifi_mode); // WIFI 模块初始化函数 +uint8 wifi_spi_init (char *wifi_ssid, char *pass_word); #endif + diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_wifi_uart.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_wifi_uart.c index 312dab7..ff728bb 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_wifi_uart.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_wifi_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_wifi_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -61,7 +61,7 @@ wifi_uart_information_struct wifi_uart_information; // 模块自身参数 -static fifo_obj_struct wifi_uart_fifo; +static fifo_struct wifi_uart_fifo; static uint8 wifi_uart_buffer[WIFI_UART_BUFFER_SIZE]; // 数据存放数组 static uint8 wifi_uart_data; diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_wifi_uart.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_wifi_uart.h index abcb253..3316b6f 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_wifi_uart.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_wifi_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_wifi_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_wireless_uart.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_wireless_uart.c index eac2867..91ec013 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_wireless_uart.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_wireless_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_wireless_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -53,7 +53,7 @@ #include "zf_device_type.h" #include "zf_device_wireless_uart.h" -static fifo_obj_struct wireless_uart_fifo; +static fifo_struct wireless_uart_fifo; static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; static uint8 wireless_uart_data = 0; diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_wireless_uart.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_wireless_uart.h index 2418545..a789ad0 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_wireless_uart.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_wireless_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_wireless_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -61,11 +61,11 @@ // 注意事项2:开启自动波特率务必连接RTS引脚 否则会开启失败。 // 注意事项3:模块自动波特率失败的话 可以尝试断电重启 -// 开启自动波特率务必阅读上面两条 注意事项 -// 开启自动波特率务必阅读上面两条 注意事项 -// 开启自动波特率务必阅读上面两条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 -// 0:关闭自动波特率 +// 0:关闭自动波特率 // 1:开启自动波特率 自动波特率的作用是修改 WIRELESS_UART_BAUD 之后不需要对模块进行配置 模块会自动设置为对应的波特率 #define WIRELESS_UART_AUTO_BAUD_RATE ( 1 ) diff --git a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_adc.c b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_adc.c index 9a262a1..06694d8 100644 --- a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_adc.c +++ b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_adc.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_adc * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_adc.h b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_adc.h index 378b67e..f017c76 100644 --- a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_adc.h +++ b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_adc.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_adc * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_delay.c b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_delay.c index 4ec533c..ae3e610 100644 --- a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_delay.c +++ b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_delay.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_delay * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_delay.h b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_delay.h index e8d82ef..7b8b475 100644 --- a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_delay.h +++ b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_delay.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_delay * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_dma.c b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_dma.c index f72f1d6..43bffbc 100644 --- a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_dma.c +++ b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_dma.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_dma * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_dma.h b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_dma.h index 1ec555b..320d40c 100644 --- a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_dma.h +++ b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_dma.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_dma * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_encoder.c b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_encoder.c index 6592198..0e0e0b9 100644 --- a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_encoder.c +++ b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_encoder.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_encoder.h b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_encoder.h index 68d159f..e079122 100644 --- a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_encoder.h +++ b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_encoder.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_exti.c b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_exti.c index 72c9a1f..31d270a 100644 --- a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_exti.c +++ b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_exti.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_exti * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_exti.h b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_exti.h index 30f5ef6..b63f9ee 100644 --- a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_exti.h +++ b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_exti.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_exti * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_flash.c b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_flash.c index f91f5a0..325cfed 100644 --- a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_flash.c +++ b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_flash.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_flash * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_flash.h b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_flash.h index 912585a..e7425fd 100644 --- a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_flash.h +++ b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_flash.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_flash * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_gpio.c b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_gpio.c index 5071114..a084353 100644 --- a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_gpio.c +++ b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_gpio.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_gpio * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_gpio.h b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_gpio.h index 2b23be0..550fb8d 100644 --- a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_gpio.h +++ b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_gpio.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_gpio * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_pit.c b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_pit.c index c4dc50d..5e03d38 100644 --- a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_pit.c +++ b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_pit.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pit * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_pit.h b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_pit.h index 5461e05..66854b5 100644 --- a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_pit.h +++ b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_pit.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pit * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_pwm.c b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_pwm.c index ad1059a..24d8d7a 100644 --- a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_pwm.c +++ b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_pwm.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pwm * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_pwm.h b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_pwm.h index d6dce78..51948a4 100644 --- a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_pwm.h +++ b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_pwm.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pwm * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_soft_iic.c b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_soft_iic.c index 9833b62..a349ec7 100644 --- a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_soft_iic.c +++ b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_soft_iic.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_iic * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_soft_iic.h b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_soft_iic.h index a62b262..80db53b 100644 --- a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_soft_iic.h +++ b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_soft_iic.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_iic * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_soft_spi.c b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_soft_spi.c index 292c60b..954fbe3 100644 --- a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_soft_spi.c +++ b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_soft_spi.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_soft_spi.h b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_soft_spi.h index 6a9c207..62858de 100644 --- a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_soft_spi.h +++ b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_soft_spi.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_spi.c b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_spi.c index 1b99196..f817dd9 100644 --- a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_spi.c +++ b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_spi.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -920,7 +920,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 do { - IfxQspi_writeTransmitFifo(moudle, (uint8)(*write_buffer & 0xFF00) >> 8); // 将发送的数据写入缓冲区 + IfxQspi_writeTransmitFifo(moudle, (uint8)((*write_buffer & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 if(read_buffer != NULL) { diff --git a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_spi.h b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_spi.h index e73507e..d15589c 100644 --- a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_spi.h +++ b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_spi.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_timer.c b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_timer.c index a953b92..e085d6e 100644 --- a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_timer.c +++ b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_timer.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_timer * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_timer.h b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_timer.h index 3c86f58..1bb348f 100644 --- a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_timer.h +++ b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_timer.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_timer * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_uart.c b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_uart.c index cd19782..fb89b55 100644 --- a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_uart.c +++ b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_uart.h b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_uart.h index 8d1d111..cdc55ab 100644 --- a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_uart.h +++ b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E09_timer_demo/user/isr.c b/Example/E09_timer_demo/user/isr.c index 27171d2..9108ff0 100644 --- a/Example/E09_timer_demo/user/isr.c +++ b/Example/E09_timer_demo/user/isr.c @@ -24,7 +24,7 @@ * 文件名称 isr * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -118,7 +118,7 @@ IFX_INTERRUPT(exti_ch1_ch5_isr, 0, EXTI_CH1_CH5_INT_PRIO) { exti_flag_clear(ERU_CH5_REQ1_P15_8); - wireless_module_spi_handler(); // SPI WIFI 中断回调函数 + } } diff --git a/Example/E10_printf_debug_log_demo/libraries/doc/version.txt b/Example/E10_printf_debug_log_demo/libraries/doc/version.txt index b841b50..d644136 100644 --- a/Example/E10_printf_debug_log_demo/libraries/doc/version.txt +++ b/Example/E10_printf_debug_log_demo/libraries/doc/version.txt @@ -1,3 +1,8 @@ +V3.2.6 + 更新逐飞助手接口函数 调用初始化时直接传参通信类 + 更新wifi SPI驱动文件 提高通信效率 + 更新GPS驱动文件,更名为GNSS,兼容普通定位模块及RTK + V3.2.5 修复延时函数初始化参数及中断向量表问题 V3.2.4 diff --git a/Example/E10_printf_debug_log_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h b/Example/E10_printf_debug_log_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h index 28ff689..371e6b6 100644 --- a/Example/E10_printf_debug_log_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h +++ b/Example/E10_printf_debug_log_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h @@ -34,7 +34,7 @@ /*------------------------------------------Configuration for IfxScu_cfg.h-------------------------------------------*/ /*********************************************************************************************************************/ /* External oscillator frequency in Hz */ -#define IFX_CFG_SCU_XTAL_FREQUENCY (20000000) /* Allowed values are: 16000000, 20000000 or 40000000 */ +#define IFX_CFG_SCU_XTAL_FREQUENCY (20000000) /* Allowed values are9p: 16000000, 20000000 or 40000000 */ /* PLL frequency in Hz */ #define IFX_CFG_SCU_PLL_FREQUENCY (200000000) /* Allowed values are: 80000000, 133000000, 160000000 * or 200000000 */ diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_clock.c b/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_clock.c index 5023270..9872ea9 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_clock.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_clock.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_clock * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_clock.h b/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_clock.h index 9face65..2b50396 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_clock.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_clock.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_clock * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_debug.c b/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_debug.c index 52c623d..d680265 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_debug.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_debug.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_debug * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -46,7 +46,7 @@ static volatile uint8 zf_debug_assert_enable = 1; #if DEBUG_UART_USE_INTERRUPT // 如果启用 debug uart 接收中断 uint8 debug_uart_buffer[DEBUG_RING_BUFFER_LEN]; // 数据存放数组 uint8 debug_uart_data; -fifo_obj_struct debug_uart_fifo; +fifo_struct debug_uart_fifo; #endif //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_debug.h b/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_debug.h index 881a297..4fb4d91 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_debug.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_debug.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_debug * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_fifo.c b/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_fifo.c index b010d3e..94f5133 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_fifo.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_fifo.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_fifo * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -45,7 +45,7 @@ // 使用示例 fifo_head_offset(fifo, 1); // 备注信息 本函数在文件内部调用 用户不用关注 也不可修改 //------------------------------------------------------------------------------------------------------------------- -static void fifo_head_offset (fifo_obj_struct *fifo, uint32 offset) +static void fifo_head_offset (fifo_struct *fifo, uint32 offset) { fifo->head += offset; @@ -63,7 +63,7 @@ static void fifo_head_offset (fifo_obj_struct *fifo, uint32 offset) // 使用示例 fifo_end_offset(fifo, 1); // 备注信息 本函数在文件内部调用 用户不用关注 也不可修改 //------------------------------------------------------------------------------------------------------------------- -static void fifo_end_offset (fifo_obj_struct *fifo, uint32 offset) +static void fifo_end_offset (fifo_struct *fifo, uint32 offset) { fifo->end += offset; @@ -80,7 +80,7 @@ static void fifo_end_offset (fifo_obj_struct *fifo, uint32 offset) // 使用示例 fifo_clear(fifo); // 备注信息 清空当前 FIFO 对象的内存 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_clear (fifo_obj_struct *fifo) +fifo_state_enum fifo_clear (fifo_struct *fifo) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -113,7 +113,7 @@ fifo_state_enum fifo_clear (fifo_obj_struct *fifo) // 使用示例 uint32 len = fifo_used(fifo); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 fifo_used (fifo_obj_struct *fifo) +uint32 fifo_used (fifo_struct *fifo) { zf_assert(fifo != NULL); return (fifo->max - fifo->size); // 返回当前 FIFO 缓冲区中数据个数 @@ -127,7 +127,7 @@ uint32 fifo_used (fifo_obj_struct *fifo) // 使用示例 zf_log(fifo_write_element(&fifo, data) == FIFO_SUCCESS, "fifo_write_byte error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat) +fifo_state_enum fifo_write_element (fifo_struct *fifo, uint32 dat) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -171,7 +171,7 @@ fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat) // 使用示例 zf_log(fifo_write_buffer(&fifo, data, 32) == FIFO_SUCCESS, "fifo_write_buffer error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 length) +fifo_state_enum fifo_write_buffer (fifo_struct *fifo, void *dat, uint32 length) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -286,7 +286,7 @@ fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 leng // 使用示例 zf_log(fifo_read_element(&fifo, data, FIFO_READ_ONLY) == FIFO_SUCCESS, "fifo_read_byte error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operation_enum flag) +fifo_state_enum fifo_read_element (fifo_struct *fifo, void *dat, fifo_operation_enum flag) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -348,7 +348,7 @@ fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operat // 使用示例 zf_log(fifo_read_buffer(&fifo, data, &length, FIFO_READ_ONLY) == FIFO_SUCCESS, "fifo_read_buffer error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) +fifo_state_enum fifo_read_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) { zf_assert(NULL != fifo); zf_assert(NULL != length); @@ -447,7 +447,7 @@ fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *leng // 如果使用 FIFO_READ_AND_CLEAN 操作 将会丢弃所有数据并清空整个 FIFO // 如果使用 FIFO_READ_AND_CLEAN 操作 将会丢弃所有数据并清空整个 FIFO //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) +fifo_state_enum fifo_read_tail_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) { zf_assert(NULL != fifo); zf_assert(NULL != length); @@ -541,7 +541,7 @@ fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 // 使用示例 fifo_init(&user_fifo, user_buffer, 64); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_init (fifo_obj_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size) +fifo_state_enum fifo_init (fifo_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_fifo.h b/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_fifo.h index 5cc7668..901a913 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_fifo.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_fifo.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_fifo * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -91,17 +91,17 @@ typedef struct uint32 end; // 缓存尾指针 总是指向非空缓存(缓存全空除外) uint32 size; // 缓存剩余大小 uint32 max; // 缓存总大小 -}fifo_obj_struct; +}fifo_struct; -fifo_state_enum fifo_clear (fifo_obj_struct *fifo); -uint32 fifo_used (fifo_obj_struct *fifo); +fifo_state_enum fifo_clear (fifo_struct *fifo); +uint32 fifo_used (fifo_struct *fifo); -fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat); -fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 length); -fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operation_enum flag); -fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); -fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); +fifo_state_enum fifo_write_element (fifo_struct *fifo, uint32 dat); +fifo_state_enum fifo_write_buffer (fifo_struct *fifo, void *dat, uint32 length); +fifo_state_enum fifo_read_element (fifo_struct *fifo, void *dat, fifo_operation_enum flag); +fifo_state_enum fifo_read_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); +fifo_state_enum fifo_read_tail_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); -fifo_state_enum fifo_init (fifo_obj_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size); +fifo_state_enum fifo_init (fifo_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size); #endif diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_font.c b/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_font.c index c816f9d..ee1df09 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_font.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_font.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_font * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_font.h b/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_font.h index 24b8602..7531250 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_font.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_font.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_font * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_function.c b/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_function.c index d403fb5..acf2739 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_function.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_function.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_function * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_function.h b/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_function.h index f5683e1..101b58a 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_function.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_function.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_function * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_headfile.h b/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_headfile.h index aa06ef8..86762db 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_headfile.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_headfile.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_headfile * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -82,7 +82,7 @@ //===================================================外接设备驱动层=================================================== #include "zf_device_absolute_encoder.h" #include "zf_device_bluetooth_ch9141.h" -#include "zf_device_gps_tau1201.h" +#include "zf_device_gnss.h" #include "zf_device_camera.h" #include "zf_device_dl1a.h" #include "zf_device_dl1b.h" @@ -108,6 +108,7 @@ //====================================================应用组件层==================================================== #include "seekfree_assistant.h" +#include "seekfree_assistant_interface.h" //====================================================应用组件层==================================================== //=====================================================用户层====================================================== diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_interrupt.c b/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_interrupt.c index 61058b2..af12fe0 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_interrupt.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_interrupt.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_interrupt * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_interrupt.h b/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_interrupt.h index 99b0e53..f828423 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_interrupt.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_interrupt.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_interrupt * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_typedef.h b/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_typedef.h index bd09f30..9a07c92 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_typedef.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_typedef.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_typedef * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_components/seekfree_assistant.c b/Example/E10_printf_debug_log_demo/libraries/zf_components/seekfree_assistant.c index a196e10..0b7cb9d 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_components/seekfree_assistant.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_components/seekfree_assistant.c @@ -1,49 +1,71 @@ /********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ -#include "zf_common_fifo.h" + +#include "zf_common_debug.h" + #include "seekfree_assistant.h" -seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 -static seekfree_assistant_camera_struct seekfree_assistant_camera_data; // 图像上位机协议数据 -static seekfree_assistant_camera_dot_struct seekfree_assistant_camera_dot_data; // 图像上位机打点协议数据 -static seekfree_assistant_camera_buffer_struct seekfree_assistant_camera_buffer; // 图像以及边界缓冲区信息 -static fifo_obj_struct seekfree_assistant_fifo; -static uint8 seekfree_assistant_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE]; // 数据存放数组 -float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 保存接收到的参数 -vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 参数更新标志位 +extern uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length); +extern uint32 seekfree_assistant_receive (uint8 *buff, uint32 length); + +#if (1 == SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE) +#include "zf_common_fifo.h" +static uint8 seekfree_assistant_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE]; // FIFO缓冲区 +static fifo_struct seekfree_assistant_fifo = // FIFO结构体 +{ + .buffer = seekfree_assistant_buffer, + .execution = FIFO_IDLE, + .type = FIFO_DATA_8BIT, + .head = 0, + .end = 0, + .size = SEEKFREE_ASSISTANT_BUFFER_SIZE, + .max = SEEKFREE_ASSISTANT_BUFFER_SIZE, +}; +#endif + +static seekfree_assistant_camera_struct seekfree_assistant_camera_data; // 图像上位机协议数据 +static seekfree_assistant_camera_dot_struct seekfree_assistant_camera_dot_data; // 图像上位机打点协议数据 +static seekfree_assistant_camera_buffer_struct seekfree_assistant_camera_buffer; // 图像以及边界缓冲区信息 + +seekfree_assistant_transfer_callback_function seekfree_assistant_transfer_callback = seekfree_assistant_transfer; // 数据发送函数指针 +seekfree_assistant_receive_callback_function seekfree_assistant_receive_callback = seekfree_assistant_receive; // 数据接收函数指针 + +seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 +float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 保存接收到的参数 +vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 参数更新标志位 //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手求和函数 @@ -87,7 +109,7 @@ void seekfree_assistant_camera_data_send (seekfree_assistant_image_type_enum cam seekfree_assistant_camera_data.image_height = height; // 首先发送帧头、功能、摄像头类型、以及宽度高度等信息 - seekfree_assistant_transfer((const uint8 *)&seekfree_assistant_camera_data, sizeof(seekfree_assistant_camera_struct)); + seekfree_assistant_transfer_callback((const uint8 *)&seekfree_assistant_camera_data, sizeof(seekfree_assistant_camera_struct)); // 根据摄像头类型计算图像大小 switch(camera_type) @@ -111,9 +133,8 @@ void seekfree_assistant_camera_data_send (seekfree_assistant_image_type_enum cam // 发送图像数据 if(NULL != image_addr) { - seekfree_assistant_transfer(image_addr, image_size); + seekfree_assistant_transfer_callback(image_addr, image_size); } - } //------------------------------------------------------------------------------------------------------------------- @@ -139,16 +160,15 @@ void seekfree_assistant_camera_dot_send (seekfree_assistant_camera_buffer_struct dot_bytes *= 2; } - // 首先发送帧头、功能、边界编号、坐标长度、点个数 - seekfree_assistant_transfer((const uint8 *)&seekfree_assistant_camera_dot_data, sizeof(seekfree_assistant_camera_dot_struct)); + seekfree_assistant_transfer_callback((const uint8 *)&seekfree_assistant_camera_dot_data, sizeof(seekfree_assistant_camera_dot_struct)); for(i=0; i < SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY; i++) { // 判断是否发送横坐标数据 if(NULL != buffer->boundary_x[i]) { - seekfree_assistant_transfer((const uint8 *)buffer->boundary_x[i], dot_bytes); + seekfree_assistant_transfer_callback((const uint8 *)buffer->boundary_x[i], dot_bytes); } // 判断是否发送纵坐标数据 @@ -156,10 +176,9 @@ void seekfree_assistant_camera_dot_send (seekfree_assistant_camera_buffer_struct { // 如果没有纵坐标数据,则表示每一行只有一个边界 // 指定了横纵坐标数据,这种方式可以实现同一行多个边界的情况,例如搜线算法能够搜索出回弯。 - seekfree_assistant_transfer((const uint8 *)buffer->boundary_y[i], dot_bytes); + seekfree_assistant_transfer_callback((const uint8 *)buffer->boundary_y[i], dot_bytes); } } - } //------------------------------------------------------------------------------------------------------------------- @@ -193,7 +212,7 @@ void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struc // 数据在调用本函数之前,由用户将需要发送的数据写入seekfree_assistant_oscilloscope_data.data[] - seekfree_assistant_transfer((const uint8 *)seekfree_assistant_oscilloscope, packet_size); + seekfree_assistant_transfer_callback((const uint8 *)seekfree_assistant_oscilloscope, packet_size); } //------------------------------------------------------------------------------------------------------------------- @@ -364,12 +383,14 @@ void seekfree_assistant_camera_send (void) } } + //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手解析接收到的数据 // 参数说明 void // 返回参数 void // 使用示例 函数只需要放到周期运行的PIT中断或者主循环即可 //------------------------------------------------------------------------------------------------------------------- +#if (1 == SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE) void seekfree_assistant_data_analysis (void) { uint8 temp_sum; @@ -380,14 +401,13 @@ void seekfree_assistant_data_analysis (void) uint32 temp_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE / 4]; // 尝试读取数据, 如果不是自定义的传输方式则从接收回调中读取数据 - read_length = seekfree_assistant_receive((uint8 *)temp_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); + read_length = seekfree_assistant_receive_callback((uint8 *)temp_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); if(read_length) { // 将读取到的数据写入FIFO fifo_write_buffer(&seekfree_assistant_fifo, (uint8 *)temp_buffer, read_length); } - while(sizeof(seekfree_assistant_parameter_struct) <= fifo_used(&seekfree_assistant_fifo)) { read_length = sizeof(seekfree_assistant_parameter_struct); @@ -416,21 +436,11 @@ void seekfree_assistant_data_analysis (void) } } - // 丢弃无需使用的数据 fifo_read_buffer(&seekfree_assistant_fifo, (uint8 *)temp_buffer, &read_length, FIFO_READ_AND_CLEAN); } } - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 逐飞助手 初始化 -// 参数说明 -// 返回参数 void -// 使用示例 -//------------------------------------------------------------------------------------------------------------------- -ZF_WEAK void seekfree_assistant_init () -{ - fifo_init(&seekfree_assistant_fifo, FIFO_DATA_8BIT, seekfree_assistant_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); -} +#endif + diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_components/seekfree_assistant.h b/Example/E10_printf_debug_log_demo/libraries/zf_components/seekfree_assistant.h index d02abb1..ae0f67c 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_components/seekfree_assistant.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_components/seekfree_assistant.h @@ -1,69 +1,75 @@ -/*/********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +/********************************************************************************************************************* +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ #ifndef _seekfree_assistant_h_ #define _seekfree_assistant_h_ #include "zf_common_typedef.h" -#include "zf_common_debug.h" + + +// 1:使能参数调节的功能 0:关闭参数调节的功能 +#define SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE ( 1 ) + + // 定义接收FIFO大小 -#define SEEKFREE_ASSISTANT_BUFFER_SIZE ( 0x80 ) +#define SEEKFREE_ASSISTANT_BUFFER_SIZE ( 0x80 ) + +// 定义示波器的最大通道数量 +#define SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT ( 0x08 ) + +// 定义参数调试的最大通道数量 +#define SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT ( 0x08 ) + +// 定义图像边线最大数量 +#define SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY ( 0x08 ) + +// 单片机往上位机发送的帧头 +#define SEEKFREE_ASSISTANT_SEND_HEAD ( 0xAA ) + +// 摄像头类 +#define SEEKFREE_ASSISTANT_CAMERA_FUNCTION ( 0x02 ) +#define SEEKFREE_ASSISTANT_CAMERA_DOT_FUNCTION ( 0x03 ) +#define SEEKFREE_ASSISTANT_CAMERA_OSCILLOSCOPE ( 0x10 ) + +// 上位机往单片机发送的帧头 +#define SEEKFREE_ASSISTANT_RECEIVE_HEAD ( 0x55 ) + +// 参数设置类 +#define SEEKFREE_ASSISTANT_RECEIVE_SET_PARAMETER ( 0x20 ) -// 定义示波器的最大通道数量 -#define SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT ( 0x08 ) - -// 定义参数调试的最大通道数量 -#define SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT ( 0x08 ) - -// 定义图像边线最大数量 -#define SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY ( 0x08 ) - -// 单片机往上位机发送的帧头 -#define SEEKFREE_ASSISTANT_SEND_HEAD ( 0xAA ) - -// 摄像头类 -#define SEEKFREE_ASSISTANT_CAMERA_FUNCTION ( 0x02 ) -#define SEEKFREE_ASSISTANT_CAMERA_DOT_FUNCTION ( 0x03 ) -#define SEEKFREE_ASSISTANT_CAMERA_OSCILLOSCOPE ( 0x10 ) - -// 上位机往单片机发送的帧头 -#define SEEKFREE_ASSISTANT_RECEIVE_HEAD ( 0x55 ) - -// 参数设置类 -#define SEEKFREE_ASSISTANT_RECEIVE_SET_PARAMETER ( 0x20 ) // 摄像头类型枚举 typedef enum @@ -91,71 +97,69 @@ typedef enum typedef struct { - uint8 head; // 帧头 - uint8 channel_num; // 高四位为功能字 低四位为通道数量 - uint8 check_sum; // 和校验 - uint8 length; // 包长度 - float data[SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT]; // 通道数据 + uint8 head; // 帧头 + uint8 channel_num; // 高四位为功能字 低四位为通道数量 + uint8 check_sum; // 和校验 + uint8 length; // 包长度 + float data[SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT]; // 通道数据 }seekfree_assistant_oscilloscope_struct; typedef struct { - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 camera_type; // 低四位表示边界数量 第四位表示是否有图像数据 例如0x13:其中3表示一副图像有三条边界(通常是左边界、中线、右边界)、1表示没有图像数据 - uint8 length; // 包长度(仅包含协议部分) - uint16 image_width; // 图像宽度 - uint16 image_height; // 图像高度 -}seekfree_assistant_camera_struct; - - -typedef struct -{ - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 dot_type; // 点类型 BIT5:1:坐标是16位的 0:坐标是8位的 BIT7-BIT6:0:只有X坐标 1:只有Y坐标 2:X和Y坐标都有 BIT3-BIT0:边界数量 - uint8 length; // 包长度(仅包含协议部分) - uint16 dot_num; // 画点数量 - uint8 valid_flag; // 通道标识 - uint8 reserve; // 保留 -}seekfree_assistant_camera_dot_struct; - -typedef struct -{ - void *image_addr; // 摄像头地址 - uint16 width; // 图像宽度 - uint16 height; // 图像高度 - seekfree_assistant_image_type_enum camera_type; // 摄像头类型 - void *boundary_x[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界横坐标数组地址 - void *boundary_y[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界纵坐标数组地址 + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 camera_type; // 低四位表示边界数量 第四位表示是否有图像数据 例如0x13:其中3表示一副图像有三条边界(通常是左边界、中线、右边界)、1表示没有图像数据 + uint8 length; // 包长度(仅包含协议部分) + uint16 image_width; // 图像宽度 + uint16 image_height; // 图像高度 +}seekfree_assistant_camera_struct; + + +typedef struct +{ + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 dot_type; // 点类型 BIT5:1:坐标是16位的 0:坐标是8位的 BIT7-BIT6:0:只有X坐标 1:只有Y坐标 2:X和Y坐标都有 BIT3-BIT0:边界数量 + uint8 length; // 包长度(仅包含协议部分) + uint16 dot_num; // 画点数量 + uint8 valid_flag; // 通道标识 + uint8 reserve; // 保留 +}seekfree_assistant_camera_dot_struct; + +typedef struct +{ + void *image_addr; // 摄像头地址 + uint16 width; // 图像宽度 + uint16 height; // 图像高度 + seekfree_assistant_image_type_enum camera_type; // 摄像头类型 + void *boundary_x[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界横坐标数组地址 + void *boundary_y[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界纵坐标数组地址 }seekfree_assistant_camera_buffer_struct; typedef struct { - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 channel; // 通道 - uint8 check_sum; // 和校验 - float data; // 数据 + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 channel; // 通道 + uint8 check_sum; // 和校验 + float data; // 数据 }seekfree_assistant_parameter_struct; +typedef uint32 (*seekfree_assistant_transfer_callback_function) (const uint8 *buff, uint32 length); +typedef uint32 (*seekfree_assistant_receive_callback_function) (uint8 *buff, uint32 length); -extern seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 -extern float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 保存接收到的参数 -extern vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 参数更新标志位 +extern seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 +extern float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 保存接收到的参数 +extern vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 参数更新标志位 + + +void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struct *seekfree_assistant_oscilloscope); +void seekfree_assistant_camera_information_config (seekfree_assistant_image_type_enum camera_type, void *image_addr, uint16 width, uint16 height); +void seekfree_assistant_camera_boundary_config (seekfree_assistant_boundary_type_enum boundary_type, uint16 dot_num, void *dot_x1, void *dot_x2, void *dot_x3, void *dot_y1, void *dot_y2, void *dot_y3); +void seekfree_assistant_camera_send (void); +void seekfree_assistant_data_analysis (void); -uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length); -uint32 seekfree_assistant_receive (uint8 *buff, uint32 length); - -void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struct *seekfree_assistant_oscilloscope); - -void seekfree_assistant_camera_information_config (seekfree_assistant_image_type_enum camera_type, void *image_addr, uint16 width, uint16 height); -void seekfree_assistant_camera_boundary_config (seekfree_assistant_boundary_type_enum boundary_type, uint16 dot_num, void *dot_x1, void *dot_x2, void *dot_x3, void *dot_y1, void *dot_y2, void *dot_y3); -void seekfree_assistant_camera_send (void); - -void seekfree_assistant_data_analysis (void); -void seekfree_assistant_init (void); #endif diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_components/seekfree_assistant_interface.c b/Example/E10_printf_debug_log_demo/libraries/zf_components/seekfree_assistant_interface.c index 99dbeef..fdade63 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_components/seekfree_assistant_interface.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_components/seekfree_assistant_interface.c @@ -1,42 +1,55 @@ /********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant_interface * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ #include "zf_common_typedef.h" +#include "zf_common_fifo.h" #include "zf_common_debug.h" +#include "zf_driver_uart.h" +#include "zf_device_wireless_uart.h" +#include "zf_device_bluetooth_ch9141.h" +#include "zf_device_wifi_uart.h" +#include "zf_device_wifi_spi.h" #include "seekfree_assistant.h" +#include "seekfree_assistant_interface.h" + + +extern seekfree_assistant_transfer_callback_function seekfree_assistant_transfer_callback; // 数据发送函数指针 +extern seekfree_assistant_receive_callback_function seekfree_assistant_receive_callback; // 数据接收函数指针 + + //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手发送函数 // 参数说明 *buff 需要发送的数据地址 @@ -46,11 +59,9 @@ //------------------------------------------------------------------------------------------------------------------- ZF_WEAK uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length) { - uint32 len = 0; - - len = debug_send_buffer(buff, length); - - return len; + + // 当选择自定义通讯方式时 需要自行完成数据发送功能 + return length; } //------------------------------------------------------------------------------------------------------------------- @@ -62,11 +73,57 @@ ZF_WEAK uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length) //------------------------------------------------------------------------------------------------------------------- ZF_WEAK uint32 seekfree_assistant_receive (uint8 *buff, uint32 length) { - uint32 len = 0; + // 当选择自定义通讯方式时 需要自行完成数据接收功能 + return 0; +} - len = debug_read_ring_buffer(buff, length); - - return len; +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 逐飞助手接口 初始化 +// 参数说明 +// 返回参数 void +// 使用示例 seekfree_assistant_interface_init(SEEKFREE_ASSISTANT_WIFI_SPI); 使用高速WIFI SPI模块进行数据收发 +// 备注 需要自行调用设备的初始化,例如使用无线转串口进行数据的收发,则需要自行调用无线转串口的初始化,然后再调用seekfree_assistant_interface_init完成逐飞助手的接口初始化 +//------------------------------------------------------------------------------------------------------------------- +ZF_WEAK void seekfree_assistant_interface_init (seekfree_assistant_transfer_device_enum transfer_device) +{ + switch(transfer_device) + { + case SEEKFREE_ASSISTANT_DEBUG_UART: + { + seekfree_assistant_transfer_callback = debug_send_buffer; + seekfree_assistant_receive_callback = debug_read_ring_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIRELESS_UART: + { + seekfree_assistant_transfer_callback = wireless_uart_send_buffer; + seekfree_assistant_receive_callback = wireless_uart_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_CH9141: + { + seekfree_assistant_transfer_callback = bluetooth_ch9141_send_buffer; + seekfree_assistant_receive_callback = bluetooth_ch9141_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIFI_UART: + { + seekfree_assistant_transfer_callback = wifi_uart_send_buffer; + seekfree_assistant_receive_callback = wifi_uart_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIFI_SPI: + { + seekfree_assistant_transfer_callback = wifi_spi_send_buffer; + seekfree_assistant_receive_callback = wifi_spi_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_CUSTOM: + { + // 根据自己的需求 自行实现seekfree_assistant_transfer与seekfree_assistant_receive函数,完成数据的收发 + + }break; + } } diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_components/seekfree_assistant_interface.h b/Example/E10_printf_debug_log_demo/libraries/zf_components/seekfree_assistant_interface.h new file mode 100644 index 0000000..940b5f7 --- /dev/null +++ b/Example/E10_printf_debug_log_demo/libraries/zf_components/seekfree_assistant_interface.h @@ -0,0 +1,57 @@ +/********************************************************************************************************************* +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 +* Copyright (c) 2022 SEEKFREE 逐飞科技 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 +* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 +* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 +* +* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 +* 甚至没有隐含的适销性或适合特定用途的保证 +* 更多细节请参见 GPL +* +* 您应该在收到本开源库的同时收到一份 GPL 的副本 +* 如果没有,请参阅 +* +* 额外注明: +* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 +* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 +* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 +* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) +* +* 文件名称 seekfree_assistant_interface +* 公司名称 成都逐飞科技有限公司 +* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A +* 店铺链接 https://seekfree.taobao.com/ +* +* 修改记录 +* 日期 作者 备注 +* 2024-1-11 SeekFree first version +********************************************************************************************************************/ + +#ifndef _seekfree_assistant_interface_h_ +#define _seekfree_assistant_interface_h_ + + + +// 数据发送设备枚举 +typedef enum +{ + SEEKFREE_ASSISTANT_DEBUG_UART, // 调试串口 使用的串口由DEBUG_UART_INDEX宏定义指定 + SEEKFREE_ASSISTANT_WIRELESS_UART, // 无线转串口 + SEEKFREE_ASSISTANT_CH9141, // CH9141蓝牙 + SEEKFREE_ASSISTANT_WIFI_UART, // WIFI转串口 + SEEKFREE_ASSISTANT_WIFI_SPI, // 高速WIFI SPI + SEEKFREE_ASSISTANT_CUSTOM, // 自定义通讯方式 需要自行seekfree_assistant_transfer与seekfree_assistant_receive函数 +}seekfree_assistant_transfer_device_enum; + + +void seekfree_assistant_interface_init (seekfree_assistant_transfer_device_enum transfer_device); + + + +#endif diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_absolute_encoder.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_absolute_encoder.c index 7c80a3b..f9bc809 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_absolute_encoder.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_absolute_encoder.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_absolute_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_absolute_encoder.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_absolute_encoder.h index e6cc057..ed92906 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_absolute_encoder.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_absolute_encoder.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_absolute_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c index 500bccb..b0a06df 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_bluetooth_ch9141 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -54,7 +54,7 @@ #include "zf_device_camera.h" #include "zf_device_bluetooth_ch9141.h" -static fifo_obj_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 +static fifo_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 static uint8 bluetooth_ch9141_buffer[BLUETOOTH_CH9141_BUFFER_SIZE]; // 数据存放数组 static uint8 bluetooth_ch9141_data = 0; // 数据临时存放变量 diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h index 800be6c..ffb30b5 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h @@ -24,7 +24,7 @@ * 文件名称 main * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_camera.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_camera.c index 84c7aa0..68668c4 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_camera.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_camera.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_camera * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -45,7 +45,7 @@ #include "zf_device_camera.h" -fifo_obj_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 +fifo_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; // 定义摄像头接收数据缓冲区 uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // 定义摄像头数据发送到上位机的帧头 diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_camera.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_camera.h index 58efb06..2cd7d2d 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_camera.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_camera.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_camera * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -44,7 +44,7 @@ //=================================================摄像头公共库 基本配置================================================ #define CAMERA_RECEIVER_BUFFER_SIZE (8) // 定义摄像头接收数据缓冲区大小 -extern fifo_obj_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 +extern fifo_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 extern uint8 camera_send_image_frame_header[4]; // 声明摄像头数据发送到上位机的帧头 //=================================================摄像头公共库 基本配置================================================ diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_config.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_config.h index af6a3d8..6c8147d 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_config.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_config.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_config * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_dl1a.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_dl1a.c index 3e7410c..27be3a7 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_dl1a.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_dl1a.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1a * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_dl1a.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_dl1a.h index 89145d3..3176dd3 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_dl1a.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_dl1a.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1a * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_dl1b.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_dl1b.c index 90e64b3..96e472e 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_dl1b.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_dl1b.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1b * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_dl1b.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_dl1b.h index b144739..922b3ce 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_dl1b.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_dl1b.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1b * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_gnss.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_gnss.c new file mode 100644 index 0000000..caf7cd0 --- /dev/null +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_gnss.c @@ -0,0 +1,620 @@ +/********************************************************************************************************************* +* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* Copyright (c) 2022 SEEKFREE 逐飞科技 +* +* 本文件是 TC264 开源库的一部分 +* +* TC264 开源库 是免费软件 +* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 +* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 +* +* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 +* 甚至没有隐含的适销性或适合特定用途的保证 +* 更多细节请参见 GPL +* +* 您应该在收到本开源库的同时收到一份 GPL 的副本 +* 如果没有,请参阅 +* +* 额外注明: +* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 +* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 +* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 +* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) +* +* 文件名称 zf_device_gnss +* 公司名称 成都逐飞科技有限公司 +* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 +* 开发环境 ADS v1.9.20 +* 适用平台 TC264D +* 店铺链接 https://seekfree.taobao.com/ +* +* 修改记录 +* 日期 作者 备注 +* 2023-12-28 pudding first version +********************************************************************************************************************/ +/********************************************************************************************************************* +* 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* RX 查看 zf_device_gnss.h 中 GNSS_RX 宏定义 +* TX 查看 zf_device_gnss.h 中 GNSS_TX 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* ------------------------------------ +********************************************************************************************************************/ + +#include "math.h" +#include "zf_common_function.h" +#include "zf_common_fifo.h" +#include "zf_driver_delay.h" +#include "zf_driver_uart.h" + +#include "zf_device_gnss.h" + +#define GNSS_BUFFER_SIZE ( 128 ) + +uint8 gnss_flag = 0; // 1:采集完成等待处理数据 0:没有采集完成 +gnss_info_struct gnss; // GPS解析之后的数据 + +static uint8 gnss_state = 0; // 1:GPS初始化完成 +static fifo_struct gnss_receiver_fifo; // +static uint8 gnss_receiver_buffer[GNSS_BUFFER_SIZE]; // 数据存放数组 + +static gps_state_enum gnss_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 +static gps_state_enum gnss_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 +static gps_state_enum gnss_ths_state = GPS_STATE_RECEIVING; // rmc 语句状态 + +static uint8 gps_gga_buffer[GNSS_BUFFER_SIZE]; +static uint8 gps_rmc_buffer[GNSS_BUFFER_SIZE]; +static uint8 gps_ths_buffer[GNSS_BUFFER_SIZE]; + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 获取指定 ',' 后面的索引 +// 参数说明 num 第几个逗号 +// 参数说明 *str 字符串 +// 返回参数 uint8 返回索引 +// 使用示例 get_parameter_index(1, s); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 get_parameter_index (uint8 num, char *str) +{ + uint8 i = 0, j = 0; + char *temp = strchr(str, '\n'); + uint8 len = 0, len1 = 0; + + 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; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 给定字符串第一个 ',' 之前的数据转换为int +// 参数说明 *s 字符串 +// 返回参数 float 返回数值 +// 使用示例 get_int_number(&buf[get_parameter_index(7, buf)]); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static int get_int_number (char *s) +{ + char buf[10]; + uint8 i = 0; + int return_value = 0; + i = get_parameter_index(1, s); + i = i - 1; + strncpy(buf, s, i); + buf[i] = 0; + return_value = func_str_to_int(buf); + return return_value; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 给定字符串第一个 ',' 之前的数据转换为float +// 参数说明 *s 字符串 +// 返回参数 float 返回数值 +// 使用示例 get_float_number(&buf[get_parameter_index(8, buf)]); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static float get_float_number (char *s) +{ + uint8 i = 0; + char buf[15]; + float return_value = 0; + + i = get_parameter_index(1, s); + i = i - 1; + strncpy(buf, s, i); + buf[i] = 0; + return_value = (float)func_str_to_double(buf); + return return_value; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 给定字符串第一个 ',' 之前的数据转换为double +// 参数说明 *s 字符串 +// 返回参数 double 返回数值 +// 使用示例 get_double_number(&buf[get_parameter_index(3, buf)]); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static double get_double_number (char *s) +{ + uint8 i = 0; + char buf[15]; + double return_value = 0; + + i = get_parameter_index(1, s); + i = i - 1; + strncpy(buf, s, i); + buf[i] = 0; + return_value = func_str_to_double(buf); + return return_value; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 世界时间转换为北京时间 +// 参数说明 *time 保存的时间 +// 返回参数 void +// 使用示例 utc_to_btc(&gnss->time); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static void utc_to_btc (gps_time_struct *time) +{ + uint8 day_num = 0; + + time->hour = time->hour + 8; + if(23 < time->hour) + { + time->hour -= 24; + time->day += 1; + + if(2 == time->month) + { + day_num = 28; + if((0 == time->year % 4 && 0 != time->year % 100) || 0 == time->year % 400) // 判断是否为闰年 + { + day_num ++; // 闰月 2月为29天 + } + } + else + { + day_num = 31; // 1 3 5 7 8 10 12这些月份为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(12 < time->month) + { + time->month -= 12; + time->year ++; + } + } + } +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 RMC语句解析 +// 参数说明 *line 接收到的语句信息 +// 参数说明 *gnss 保存解析后的数据 +// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 +// 使用示例 gps_gnrmc_parse((char *)data_buffer, &gnss); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 gps_gnrmc_parse (char *line, gnss_info_struct *gnss) +{ + uint8 state = 0, temp = 0; + + double latitude = 0; // 纬度 + double longitude = 0; // 经度 + + double lati_cent_tmp = 0, lati_second_tmp = 0; + double long_cent_tmp = 0, long_second_tmp = 0; + float speed_tmp = 0; + char *buf = line; + uint8 return_state = 0; + + state = buf[get_parameter_index(2, buf)]; + + if('A' == state) // 如果数据有效 则解析数据 + { + return_state = 1; + gnss->state = 1; + gnss -> ns = buf[get_parameter_index(4, buf)]; + gnss -> 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)]); + + gnss->latitude_degree = (int)latitude / 100; // 纬度转换为度分秒 + lati_cent_tmp = (latitude - gnss->latitude_degree * 100); + gnss->latitude_cent = (int)lati_cent_tmp; + lati_second_tmp = (lati_cent_tmp - gnss->latitude_cent) * 6000; + gnss->latitude_second = (int)lati_second_tmp; + + gnss->longitude_degree = (int)longitude / 100; // 经度转换为度分秒 + long_cent_tmp = (longitude - gnss->longitude_degree * 100); + gnss->longitude_cent = (int)long_cent_tmp; + long_second_tmp = (long_cent_tmp - gnss->longitude_cent) * 6000; + gnss->longitude_second = (int)long_second_tmp; + + gnss->latitude = gnss->latitude_degree + lati_cent_tmp / 60; + gnss->longitude = gnss->longitude_degree + long_cent_tmp / 60; + + speed_tmp = get_float_number(&buf[get_parameter_index(7, buf)]); // 速度(海里/小时) + gnss->speed = speed_tmp * 1.85f; // 转换为公里/小时 + gnss->direction = get_float_number(&buf[get_parameter_index(8, buf)]); // 角度 + } + else + { + gnss->state = 0; + } + + // 在定位没有生效前也是有时间数据的,可以直接解析 + gnss->time.hour = (buf[7] - '0') * 10 + (buf[8] - '0'); // 时间 + gnss->time.minute = (buf[9] - '0') * 10 + (buf[10] - '0'); + gnss->time.second = (buf[11] - '0') * 10 + (buf[12] - '0'); + temp = get_parameter_index(9, buf); + gnss->time.day = (buf[temp + 0] - '0') * 10 + (buf[temp + 1] - '0'); // 日期 + gnss->time.month = (buf[temp + 2] - '0') * 10 + (buf[temp + 3] - '0'); + gnss->time.year = (buf[temp + 4] - '0') * 10 + (buf[temp + 5] - '0') + 2000; + + utc_to_btc(&gnss->time); + + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 GGA语句解析 +// 参数说明 *line 接收到的语句信息 +// 参数说明 *gnss 保存解析后的数据 +// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 +// 使用示例 gps_gngga_parse((char *)data_buffer, &gnss); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 gps_gngga_parse (char *line, gnss_info_struct *gnss) +{ + uint8 state = 0; + char *buf = line; + uint8 return_state = 0; + + state = buf[get_parameter_index(2, buf)]; + + if(',' != state) + { + gnss->satellite_used = (uint8)get_int_number(&buf[get_parameter_index(7, buf)]); + gnss->height = get_float_number(&buf[get_parameter_index(9, buf)]) + get_float_number(&buf[get_parameter_index(11, buf)]); // 高度 = 海拔高度 + 地球椭球面相对大地水准面的高度 + return_state = 1; + } + + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 THS语句解析 +// 参数说明 *line 接收到的语句信息 +// 参数说明 *gnss 保存解析后的数据 +// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 +// 使用示例 gps_gnths_parse((char *)data_buffer, &gnss); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 gps_gnths_parse (char *line, gnss_info_struct *gnss) +{ + uint8 state = 0; + char *buf = line; + uint8 return_state = 0; + + state = buf[get_parameter_index(2, buf)]; + + if('A' == state) + { + gnss->antenna_direction_state = 1; + gnss->antenna_direction = get_float_number(&buf[get_parameter_index(1, buf)]); + return_state = 1; + } + else + { + gnss->antenna_direction_state = 0; + } + + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 计算从第一个点到第二个点的距离 +// 参数说明 latitude1 第一个点的纬度 +// 参数说明 longitude1 第一个点的经度 +// 参数说明 latitude2 第二个点的纬度 +// 参数说明 longitude2 第二个点的经度 +// 返回参数 double 返回两点距离 +// 使用示例 get_two_points_distance(latitude1_1, longitude1, latitude2, longitude2); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +double get_two_points_distance (double latitude1, double longitude1, double latitude2, double longitude2) +{ + const double EARTH_RADIUS = 6378137; // 地球半径(单位:m) + double rad_latitude1 = 0; + double rad_latitude2 = 0; + double rad_longitude1 = 0; + double rad_longitude2 = 0; + double distance = 0; + double a = 0; + double b = 0; + + rad_latitude1 = ANGLE_TO_RAD(latitude1); // 根据角度计算弧度 + 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 里面实现的算法 + distance = distance * EARTH_RADIUS; + + return distance; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 计算从第一个点到第二个点的方位角 +// 参数说明 latitude1 第一个点的纬度 +// 参数说明 longitude1 第一个点的经度 +// 参数说明 latitude2 第二个点的纬度 +// 参数说明 longitude2 第二个点的经度 +// 返回参数 double 返回方位角(0至360) +// 使用示例 get_two_points_azimuth(latitude1_1, longitude1, latitude2, longitude2); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +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 ((0 < angle) ? angle : (angle + 360)); +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 解析GPS数据 +// 参数说明 void +// 返回参数 uint8 0-解析成功 1-解析失败 可能数据包错误 +// 使用示例 gps_data_parse(); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +uint8 gnss_data_parse (void) +{ + uint8 return_state = 0; + uint8 check_buffer[5] = {'0', 'x', 0x00, 0x00, 0x00}; + uint8 bbc_xor_origin = 0; + uint8 bbc_xor_calculation = 0; + uint32 data_len = 0; + + do + { + if(GPS_STATE_RECEIVED == gnss_rmc_state) + { + gnss_rmc_state = GPS_STATE_PARSING; + strncpy((char *)&check_buffer[2], strchr((const char *)gps_rmc_buffer, '*') + 1, 2); + bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); + for(bbc_xor_calculation = gps_rmc_buffer[1], data_len = 2; '*' != gps_rmc_buffer[data_len]; data_len ++) + { + bbc_xor_calculation ^= gps_rmc_buffer[data_len]; + } + if(bbc_xor_calculation != bbc_xor_origin) + { + // 数据校验失败 + return_state = 1; + break; + } + + gps_gnrmc_parse((char *)gps_rmc_buffer, &gnss); + } + gnss_rmc_state = GPS_STATE_RECEIVING; + + if(GPS_STATE_RECEIVED == gnss_gga_state) + { + gnss_gga_state = GPS_STATE_PARSING; + strncpy((char *)&check_buffer[2], strchr((const char *)gps_gga_buffer, '*') + 1, 2); + bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); + + for(bbc_xor_calculation = gps_gga_buffer[1], data_len = 2; '*' != gps_gga_buffer[data_len]; data_len ++) + { + bbc_xor_calculation ^= gps_gga_buffer[data_len]; + } + if(bbc_xor_calculation != bbc_xor_origin) + { + // 数据校验失败 + return_state = 1; + break; + } + + gps_gngga_parse((char *)gps_gga_buffer, &gnss); + } + gnss_gga_state = GPS_STATE_RECEIVING; + + if(GPS_STATE_RECEIVED == gnss_ths_state) + { + gnss_ths_state = GPS_STATE_PARSING; + strncpy((char *)&check_buffer[2], strchr((const char *)gps_ths_buffer, '*') + 1, 2); + bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); + + for(bbc_xor_calculation = gps_ths_buffer[1], data_len = 2; '*' != gps_ths_buffer[data_len]; data_len ++) + { + bbc_xor_calculation ^= gps_ths_buffer[data_len]; + } + if(bbc_xor_calculation != bbc_xor_origin) + { + // 数据校验失败 + return_state = 1; + break; + } + + gps_gnths_parse((char *)gps_ths_buffer, &gnss); + } + gnss_ths_state = GPS_STATE_RECEIVING; + + }while(0); + return return_state; +} + + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 GPS串口回调函数 +// 参数说明 void +// 返回参数 void +// 使用示例 gps_uart_callback(); +// 备注信息 此函数需要在串口接收中断内进行调用 +//------------------------------------------------------------------------------------------------------------------- +void gnss_uart_callback (void) +{ + uint8 temp_gps[6]; + uint32 temp_length = 0; + + + + + if(gnss_state) + { + uint8 dat; + while(uart_query_byte(GNSS_UART, &dat)) + { + fifo_write_buffer(&gnss_receiver_fifo, &dat, 1); + } + + if('\n' == dat) + { + // 读取前6个数据 用于判断语句类型 + temp_length = 6; + fifo_read_buffer(&gnss_receiver_fifo, temp_gps, &temp_length, FIFO_READ_ONLY); + + // 根据不同类型将数据拷贝到不同的缓冲区 + if(0 == strncmp((char *)&temp_gps[3], "RMC", 3)) + { + // 如果没有在解析数据则更新缓冲区的数据 + if(GPS_STATE_PARSING != gnss_rmc_state) + { + gnss_rmc_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_rmc_buffer, &temp_length, FIFO_READ_AND_CLEAN); + } + } + else if(0 == strncmp((char *)&temp_gps[3], "GGA", 3)) + { + // 如果没有在解析数据则更新缓冲区的数据 + if(GPS_STATE_PARSING != gnss_gga_state) + { + gnss_gga_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_gga_buffer, &temp_length, FIFO_READ_AND_CLEAN); + } + } + else if(0 == strncmp((char *)&temp_gps[3], "THS", 3)) + { + // 如果没有在解析数据则更新缓冲区的数据 + if(GPS_STATE_PARSING != gnss_ths_state) + { + gnss_ths_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_ths_buffer, &temp_length, FIFO_READ_AND_CLEAN); + } + } + + // 统一将FIFO清空 + fifo_clear(&gnss_receiver_fifo); + + gnss_flag = 1; + } + } +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 GPS初始化 +// 参数说明 void +// 返回参数 void +// 使用示例 gps_init(); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +void gnss_init (gps_device_enum gps_device) +{ + 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}; + + if((TAU1201 == gps_device) || (GN42A == gps_device)) + { + fifo_init(&gnss_receiver_fifo, FIFO_DATA_8BIT, gnss_receiver_buffer, GNSS_BUFFER_SIZE); + system_delay_ms(500); // 等待GPS启动后开始初始化 + uart_init(GNSS_UART, 115200, GNSS_RX, GNSS_TX); + + uart_write_buffer(GNSS_UART, (uint8 *)set_rate, sizeof(set_rate)); // 设置GPS更新速率为10hz 如果不调用此语句则默认为1hz + system_delay_ms(200); + + uart_write_buffer(GNSS_UART, (uint8 *)open_rmc, sizeof(open_rmc)); // 开启rmc语句 + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)open_gga, sizeof(open_gga)); // 开启gga语句 + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gll, sizeof(close_gll)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gsa, sizeof(close_gsa)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_grs, sizeof(close_grs)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gsv, sizeof(close_gsv)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_vtg, sizeof(close_vtg)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_zda, sizeof(close_zda)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gst, sizeof(close_gst)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_txt, sizeof(close_txt)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_txt_ant, sizeof(close_txt_ant)); + system_delay_ms(50); + + gnss_state = 1; + uart_rx_interrupt(GNSS_UART, 1); + } + else if(GN43RFA == gps_device) + { + // GN43RFA RTK模块不需要进行参数设置,如果需要修改参数应该使用专用的上位机修改参数 + fifo_init(&gnss_receiver_fifo, FIFO_DATA_8BIT, gnss_receiver_buffer, GNSS_BUFFER_SIZE); + uart_init(GNSS_UART, 115200, GNSS_RX, GNSS_TX); + gnss_state = 1; + uart_rx_interrupt(GNSS_UART, 1); + } + +} diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_gnss.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_gnss.h new file mode 100644 index 0000000..5d58976 --- /dev/null +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_gnss.h @@ -0,0 +1,125 @@ +/********************************************************************************************************************* +* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* Copyright (c) 2022 SEEKFREE 逐飞科技 +* +* 本文件是 TC264 开源库的一部分 +* +* TC264 开源库 是免费软件 +* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 +* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 +* +* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 +* 甚至没有隐含的适销性或适合特定用途的保证 +* 更多细节请参见 GPL +* +* 您应该在收到本开源库的同时收到一份 GPL 的副本 +* 如果没有,请参阅 +* +* 额外注明: +* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 +* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 +* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 +* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) +* +* 文件名称 zf_device_gnss +* 公司名称 成都逐飞科技有限公司 +* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 +* 开发环境 ADS v1.9.20 +* 适用平台 TC264D +* 店铺链接 https://seekfree.taobao.com/ +* +* 修改记录 +* 日期 作者 备注 +* 2023-12-28 pudding first version +********************************************************************************************************************/ +/********************************************************************************************************************* +* 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* RX 查看 zf_device_gnss.h 中 GNSS_RX 宏定义 +* TX 查看 zf_device_gnss.h 中 GNSS_TX 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* ------------------------------------ +********************************************************************************************************************/ + +#ifndef _zf_device_gnss_h_ +#define _zf_device_gnss_h_ + +#include "zf_common_typedef.h" + +//-------------------------------------------------------------------------------------------------- +//引脚配置 +//-------------------------------------------------------------------------------------------------- +#define GNSS_UART (UART_3) +#define GNSS_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 +#define GNSS_TX (UART3_RX_P15_7) // GPS TX串口引脚 + +#define ANGLE_TO_RAD(x) ( (x) * PI / 180.0 ) // 角度转换为弧度 +#define RAD_TO_ANGLE(x) ( (x) * 180.0 / PI ) // 弧度转换为角度 +#define PI ( 3.1415926535898 ) + +typedef enum +{ + TAU1201 = 1, // 逐飞科技双频GPS模块 + GN42A = 1, // 逐飞科技双频GPS模块 与TAU1201是一样的 + GN43RFA = 2, // 逐飞科技三频RTK模块 +}gps_device_enum; + +typedef struct +{ + uint16 year; + uint8 month; + uint8 day; + uint8 hour; + uint8 minute; + uint8 second; +}gps_time_struct; + +typedef struct +{ + gps_time_struct time; // 时间 + + uint8 state; // 有效状态 1:定位有效 0:定位无效 + + uint16 latitude_degree; // 度 + uint16 latitude_cent; // 分 + uint16 latitude_second; // 秒 这里的秒是被放大了100倍的,主要是避免使用浮点数 + uint16 longitude_degree; // 度 + uint16 longitude_cent; // 分 + uint16 longitude_second; // 秒 这里的秒是被放大了100倍的,主要是避免使用浮点数 + + double latitude; // 纬度 + double longitude; // 经度 + + int8 ns; // 纬度半球 N(北半球)或 S(南半球) + int8 ew; // 经度半球 E(东经)或 W(西经) + + float speed; // 速度(公里/每小时) + float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准)+ + uint8 antenna_direction_state; // 双天线测向有效状态 1:测向有效 0:测向无效,无效时antenna_direction数据是无效的 + float antenna_direction; // 主天线指向从天线与真北构成的夹角(000.0~359.9 度) + + // 下面两个个信息从GNGGA语句中获取 + uint8 satellite_used; // 用于定位的卫星数量 + float height; // 高度 +}gnss_info_struct; + +typedef enum +{ + GPS_STATE_RECEIVING, // 正在接收数据 + GPS_STATE_RECEIVED, // 数据接收完成 + GPS_STATE_PARSING, // 正在解析 +}gps_state_enum; + +extern gnss_info_struct gnss; +extern uint8 gnss_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); +uint8 gnss_data_parse (void); +void gnss_uart_callback (void); +void gnss_init (gps_device_enum gps_device); + +#endif diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_gps_tau1201.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_gps_tau1201.c deleted file mode 100644 index da46a99..0000000 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_gps_tau1201.c +++ /dev/null @@ -1,541 +0,0 @@ -/********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 -* Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 -* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 -* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* -* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 -* 甚至没有隐含的适销性或适合特定用途的保证 -* 更多细节请参见 GPL -* -* 您应该在收到本开源库的同时收到一份 GPL 的副本 -* 如果没有,请参阅 -* -* 额外注明: -* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 -* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 -* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 -* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* -* 文件名称 zf_device_gps_tau1201 -* 公司名称 成都逐飞科技有限公司 -* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D -* 店铺链接 https://seekfree.taobao.com/ -* -* 修改记录 -* 日期 作者 备注 -* 2022-09-15 pudding first version -* 2023-04-28 pudding 增加中文注释说明 -********************************************************************************************************************/ -/******************************************************************************************************************** -* 接线定义: -* ------------------------------------ -* 模块管脚 单片机管脚 -* RX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_RX 宏定义 -* TX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_TX 宏定义 -* VCC 3.3V电源 -* GND 电源地 -* ------------------------------------ -********************************************************************************************************************/ - -#include "math.h" -#include "zf_common_function.h" -#include "zf_common_fifo.h" -#include "zf_driver_delay.h" -#include "zf_driver_uart.h" - -#include "zf_device_gps_tau1201.h" - -#define GPS_TAU1201_BUFFER_SIZE ( 128 ) - -uint8 gps_tau1201_flag = 0; // 1:采集完成等待处理数据 0:没有采集完成 -gps_info_struct gps_tau1201; // GPS解析之后的数据 - -static uint8 gps_tau1201_state = 0; // 1:GPS初始化完成 -static fifo_obj_struct gps_tau1201_receiver_fifo; // -static uint8 gps_tau1201_receiver_buffer[GPS_TAU1201_BUFFER_SIZE]; // 数据存放数组 - -gps_state_enum gps_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 -gps_state_enum gps_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 - -static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; // GGA语句缓冲区 -static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; // RMC语句缓冲区 - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 获取指定 ',' 后面的索引 -// 参数说明 num 第几个逗号 -// 参数说明 *str 字符串 -// 返回参数 uint8 返回索引 -// 使用示例 get_parameter_index(1, s); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static uint8 get_parameter_index (uint8 num, char *str) -{ - uint8 i = 0, j = 0; - char *temp = strchr(str, '\n'); - uint8 len = 0, len1 = 0; - - 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; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 给定字符串第一个 ',' 之前的数据转换为int -// 参数说明 *s 字符串 -// 返回参数 float 返回数值 -// 使用示例 get_int_number(&buf[get_parameter_index(7, buf)]); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static int get_int_number (char *s) -{ - char buf[10]; - uint8 i = 0; - int return_value = 0; - i = get_parameter_index(1, s); - i = i - 1; - strncpy(buf, s, i); - buf[i] = 0; - return_value = func_str_to_int(buf); - return return_value; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 给定字符串第一个 ',' 之前的数据转换为float -// 参数说明 *s 字符串 -// 返回参数 float 返回数值 -// 使用示例 get_float_number(&buf[get_parameter_index(8, buf)]); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static float get_float_number (char *s) -{ - uint8 i = 0; - char buf[15]; - float return_value = 0; - - i = get_parameter_index(1, s); - i = i - 1; - strncpy(buf, s, i); - buf[i] = 0; - return_value = (float)func_str_to_double(buf); - return return_value; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 给定字符串第一个 ',' 之前的数据转换为double -// 参数说明 *s 字符串 -// 返回参数 double 返回数值 -// 使用示例 get_double_number(&buf[get_parameter_index(3, buf)]); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static double get_double_number (char *s) -{ - uint8 i = 0; - char buf[15]; - double return_value = 0; - - i = get_parameter_index(1, s); - i = i - 1; - strncpy(buf, s, i); - buf[i] = 0; - return_value = func_str_to_double(buf); - return return_value; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 世界时间转换为北京时间 -// 参数说明 *time 保存的时间 -// 返回参数 void -// 使用示例 utc_to_btc(&gps->time); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static void utc_to_btc (gps_time_struct *time) -{ - uint8 day_num = 0; - - time->hour = time->hour + 8; - if(23 < time->hour) - { - time->hour -= 24; - time->day += 1; - - if(2 == time->month) - { - day_num = 28; - if((0 == time->year % 4 && 0 != time->year % 100) || 0 == time->year % 400) // 判断是否为闰年 - { - day_num ++; // 闰月 2月为29天 - } - } - else - { - day_num = 31; // 1 3 5 7 8 10 12这些月份为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(12 < time->month) - { - time->month -= 12; - time->year ++; - } - } - } -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 RMC语句解析 -// 参数说明 *line 接收到的语句信息 -// 参数说明 *gps 保存解析后的数据 -// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 -// 使用示例 gps_gnrmc_parse((char *)data_buffer, &gps_tau1201); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static uint8 gps_gnrmc_parse (char *line, gps_info_struct *gps) -{ - uint8 state = 0, temp = 0; - - double latitude = 0; // 纬度 - double longitude = 0; // 经度 - - double lati_cent_tmp = 0, lati_second_tmp = 0; - double long_cent_tmp = 0, long_second_tmp = 0; - float speed_tmp = 0; - char *buf = line; - uint8 return_state = 0; - - state = buf[get_parameter_index(2, buf)]; - - gps->state = 0; - if('A' == state) // 如果数据有效 则解析数据 - { - return_state = 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; // 纬度转换为度分秒 - lati_cent_tmp = (latitude - gps->latitude_degree * 100); - gps->latitude_cent = (int)lati_cent_tmp; - lati_second_tmp = (lati_cent_tmp - gps->latitude_cent) * 6000; - gps->latitude_second = (int)lati_second_tmp; - - gps->longitude_degree = (int)longitude / 100; // 经度转换为度分秒 - long_cent_tmp = (longitude - gps->longitude_degree * 100); - gps->longitude_cent = (int)long_cent_tmp; - long_second_tmp = (long_cent_tmp - gps->longitude_cent) * 6000; - gps->longitude_second = (int)long_second_tmp; - - gps->latitude = gps->latitude_degree + lati_cent_tmp / 60; - gps->longitude = gps->longitude_degree + long_cent_tmp / 60; - - speed_tmp = get_float_number(&buf[get_parameter_index(7, buf)]); // 速度(海里/小时) - gps->speed = speed_tmp * 1.85f; // 转换为公里/小时 - gps->direction = get_float_number(&buf[get_parameter_index(8, buf)]); // 角度 - } - - // 在定位没有生效前也是有时间数据的,可以直接解析 - gps->time.hour = (buf[7] - '0') * 10 + (buf[8] - '0'); // 时间 - 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'); // 日期 - 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_state; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 GGA语句解析 -// 参数说明 *line 接收到的语句信息 -// 参数说明 *gps 保存解析后的数据 -// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 -// 使用示例 gps_gngga_parse((char *)data_buffer, &gps_tau1201); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static uint8 gps_gngga_parse (char *line, gps_info_struct *gps) -{ - uint8 state = 0; - char *buf = line; - uint8 return_state = 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)]); // 高度 = 海拔高度 + 地球椭球面相对大地水准面的高度 - return_state = 1; - } - - return return_state; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 计算从第一个点到第二个点的距离 -// 参数说明 latitude1 第一个点的纬度 -// 参数说明 longitude1 第一个点的经度 -// 参数说明 latitude2 第二个点的纬度 -// 参数说明 longitude2 第二个点的经度 -// 返回参数 double 返回两点距离 -// 使用示例 get_two_points_distance(latitude1_1, longitude1, latitude2, longitude2); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -double get_two_points_distance (double latitude1, double longitude1, double latitude2, double longitude2) -{ - const double EARTH_RADIUS = 6378137; // 地球半径(单位:m) - double rad_latitude1 = 0; - double rad_latitude2 = 0; - double rad_longitude1 = 0; - double rad_longitude2 = 0; - double distance = 0; - double a = 0; - double b = 0; - - rad_latitude1 = ANGLE_TO_RAD(latitude1); // 根据角度计算弧度 - 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 里面实现的算法 - distance = distance * EARTH_RADIUS; - - return distance; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 计算从第一个点到第二个点的方位角 -// 参数说明 latitude1 第一个点的纬度 -// 参数说明 longitude1 第一个点的经度 -// 参数说明 latitude2 第二个点的纬度 -// 参数说明 longitude2 第二个点的经度 -// 返回参数 double 返回方位角(0至360) -// 使用示例 get_two_points_azimuth(latitude1_1, longitude1, latitude2, longitude2); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -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 ((0 < angle) ? angle : (angle + 360)); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 解析GPS数据 -// 参数说明 void -// 返回参数 uint8 0-解析成功 1-解析失败 可能数据包错误 -// 使用示例 gps_data_parse(); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -uint8 gps_data_parse (void) -{ - uint8 return_state = 0; - uint8 check_buffer[5] = {'0', 'x', 0x00, 0x00, 0x00}; - uint8 bbc_xor_origin = 0; - uint8 bbc_xor_calculation = 0; - uint32 data_len = 0; - - do - { - if(GPS_STATE_RECEIVED == gps_rmc_state) - { - gps_rmc_state = GPS_STATE_PARSING; - strncpy((char *)&check_buffer[2], strchr((const char *)gps_rmc_buffer, '*') + 1, 2); - bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); - for(bbc_xor_calculation = gps_rmc_buffer[1], data_len = 2; '*' != gps_rmc_buffer[data_len]; data_len ++) - { - bbc_xor_calculation ^= gps_rmc_buffer[data_len]; - } - if(bbc_xor_calculation != bbc_xor_origin) - { - // 数据校验失败 - return_state = 1; - break; - } - - gps_gnrmc_parse((char *)gps_rmc_buffer, &gps_tau1201); - } - gps_rmc_state = GPS_STATE_RECEIVING; - - if(GPS_STATE_RECEIVED == gps_gga_state) - { - gps_gga_state = GPS_STATE_PARSING; - strncpy((char *)&check_buffer[2], strchr((const char *)gps_gga_buffer, '*') + 1, 2); - bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); - - for(bbc_xor_calculation = gps_gga_buffer[1], data_len = 2; '*' != gps_gga_buffer[data_len]; data_len ++) - { - bbc_xor_calculation ^= gps_gga_buffer[data_len]; - } - if(bbc_xor_calculation != bbc_xor_origin) - { - // 数据校验失败 - return_state = 1; - break; - } - - gps_gngga_parse((char *)gps_gga_buffer, &gps_tau1201); - } - gps_gga_state = GPS_STATE_RECEIVING; - - }while(0); - return return_state; -} - - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 GPS串口回调函数 -// 参数说明 void -// 返回参数 void -// 使用示例 gps_uart_callback(); -// 备注信息 此函数需要在串口接收中断内进行调用 -//------------------------------------------------------------------------------------------------------------------- -void gps_uart_callback (void) -{ - uint8 temp_gps[6]; - uint32 temp_length = 0; - - if(gps_tau1201_state) - { - uint8 dat; - while(uart_query_byte(GPS_TAU1201_UART, &dat)) - { - fifo_write_buffer(&gps_tau1201_receiver_fifo, &dat, 1); - } - - if('\n' == dat) - { - // 读取前6个数据 用于判断语句类型 - temp_length = 6; - fifo_read_buffer(&gps_tau1201_receiver_fifo, temp_gps, &temp_length, FIFO_READ_ONLY); - - // 根据不同类型将数据拷贝到不同的缓冲区 - if(0 == strncmp((char *)&temp_gps[3], "RMC", 3)) - { - // 如果没有在解析数据则更新缓冲区的数据 - if(GPS_STATE_PARSING != gps_rmc_state) - { - gps_rmc_state = GPS_STATE_RECEIVED; - temp_length = fifo_used(&gps_tau1201_receiver_fifo); - fifo_read_buffer(&gps_tau1201_receiver_fifo, gps_rmc_buffer, &temp_length, FIFO_READ_AND_CLEAN); - } - } - else if(0 == strncmp((char *)&temp_gps[3], "GGA", 3)) - { - // 如果没有在解析数据则更新缓冲区的数据 - if(GPS_STATE_PARSING != gps_gga_state) - { - gps_gga_state = GPS_STATE_RECEIVED; - temp_length = fifo_used(&gps_tau1201_receiver_fifo); - fifo_read_buffer(&gps_tau1201_receiver_fifo, gps_gga_buffer, &temp_length, FIFO_READ_AND_CLEAN); - } - } - - // 统一将FIFO清空 - fifo_clear(&gps_tau1201_receiver_fifo); - - gps_tau1201_flag = 1; - } - } -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 GPS初始化 -// 参数说明 void -// 返回参数 void -// 使用示例 gps_init(); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -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}; - - fifo_init(&gps_tau1201_receiver_fifo, FIFO_DATA_8BIT, gps_tau1201_receiver_buffer, GPS_TAU1201_BUFFER_SIZE); - system_delay_ms(500); // 等待GPS启动后开始初始化 - uart_init(GPS_TAU1201_UART, 115200, GPS_TAU1201_RX, GPS_TAU1201_TX); - uart_rx_interrupt(GPS_TAU1201_UART, 0); - - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)set_rate, sizeof(set_rate)); // 设置GPS更新速率为10hz 如果不调用此语句则默认为1hz - system_delay_ms(200); - - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)open_rmc, sizeof(open_rmc)); // 开启rmc语句 - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)open_gga, sizeof(open_gga)); // 开启gga语句 - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gll, sizeof(close_gll)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gsa, sizeof(close_gsa)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_grs, sizeof(close_grs)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gsv, sizeof(close_gsv)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_vtg, sizeof(close_vtg)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_zda, sizeof(close_zda)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gst, sizeof(close_gst)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_txt, sizeof(close_txt)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_txt_ant, sizeof(close_txt_ant)); - system_delay_ms(50); - - gps_tau1201_state = 1; - uart_rx_interrupt(GPS_TAU1201_UART, 1); -} diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_gps_tau1201.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_gps_tau1201.h deleted file mode 100644 index c167bae..0000000 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_gps_tau1201.h +++ /dev/null @@ -1,117 +0,0 @@ -/********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 -* Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 -* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 -* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* -* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 -* 甚至没有隐含的适销性或适合特定用途的保证 -* 更多细节请参见 GPL -* -* 您应该在收到本开源库的同时收到一份 GPL 的副本 -* 如果没有,请参阅 -* -* 额外注明: -* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 -* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 -* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 -* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* -* 文件名称 zf_device_gps_tau1201 -* 公司名称 成都逐飞科技有限公司 -* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D -* 店铺链接 https://seekfree.taobao.com/ -* -* 修改记录 -* 日期 作者 备注 -* 2022-09-15 pudding first version -* 2023-04-28 pudding 增加中文注释说明 -********************************************************************************************************************/ -/******************************************************************************************************************** -* 接线定义: -* ------------------------------------ -* 模块管脚 单片机管脚 -* RX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_RX 宏定义 -* TX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_TX 宏定义 -* VCC 3.3V电源 -* GND 电源地 -* ------------------------------------ -********************************************************************************************************************/ - -#ifndef _zf_device_gps_tau1201_h_ -#define _zf_device_gps_tau1201_h_ - -#include "zf_common_typedef.h" - -//=================================================定义 定位模块 基本配置================================================ -#define GPS_TAU1201_UART (UART_3) -#define GPS_TAU1201_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 -#define GPS_TAU1201_TX (UART3_RX_P15_7) // GPS TX串口引脚 - -#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 -#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 -#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; // 时间- - uint8 state; // 有效状态 1:定位有效 0:定位无效 - uint16 latitude_degree; // 度 - uint16 latitude_cent; // 分 - uint16 latitude_second; // 秒 - uint16 longitude_degree; // 度 - uint16 longitude_cent; // 分 - uint16 longitude_second; // 秒 - double latitude; // 纬度 - double longitude; // 经度 - int8 ns; // 纬度半球 N(北半球)或 S(南半球) - int8 ew; // 经度半球 E(东经)或 W(西经) - float speed; // 速度(公里/每小时) - float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) - // 下面两个个信息从GNGGA语句中获取 - uint8 satellite_used; // 用于定位的卫星数量 - float height; // 高度 -}gps_info_struct; - -typedef enum -{ - GPS_STATE_RECEIVING, // 正在接收数据 - GPS_STATE_RECEIVED, // 数据接收完成 - GPS_STATE_PARSING, // 正在解析 -}gps_state_enum; -//================================================定义 定位模块 参数结构体================================================ - - -//=================================================声明 定位模块 全局变量================================================ -extern gps_info_struct gps_tau1201; // GPS解析之后的数据 -extern uint8 gps_tau1201_flag; // 1:采集完成等待处理数据 0:没有采集完成 -//=================================================声明 定位模块 全局变量================================================ - - -//=================================================声明 定位模块 基础函数================================================ -double get_two_points_distance (double lat1, double lng1, double lat2, double lng2); // 计算从第一个点到第二个点的距离(单位:m) -double get_two_points_azimuth (double lat1, double lon1, double lat2, double lon2); // 计算从第一个点到第二个点的方位角(单位:°) -uint8 gps_data_parse (void); // 解析GPS数据 -void gps_uart_callback (void); // GPS回调函数 -void gps_init (void); // GPS初始化 -//=================================================声明 定位模块 基础函数================================================ -#endif diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_icm20602.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_icm20602.c index f4ae830..ddebf3c 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_icm20602.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_icm20602.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_icm20602 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_icm20602.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_icm20602.h index 67724ad..209972b 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_icm20602.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_icm20602.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_icm20602 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_imu660ra.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_imu660ra.c index 95144f9..02fdb9e 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_imu660ra.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_imu660ra.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu660ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_imu660ra.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_imu660ra.h index a689df1..348e6a1 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_imu660ra.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_imu660ra.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu660ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_imu963ra.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_imu963ra.c index 92ec0f6..595142a 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_imu963ra.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_imu963ra.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu963ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_imu963ra.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_imu963ra.h index 4d0d9f9..c0f981f 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_imu963ra.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_imu963ra.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu963ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ips114.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ips114.c index 78c6f3b..b13e338 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ips114.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ips114.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips114 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ips114.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ips114.h index 81dfc3c..ba932b1 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ips114.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ips114.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips114 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ips200.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ips200.c index cd8681f..37d9d04 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ips200.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ips200.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips200 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ips200.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ips200.h index ce59927..045bf27 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ips200.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ips200.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips200 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_key.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_key.c index 9e42c8a..8b240cb 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_key.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_key.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_key * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_key.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_key.h index bcab8aa..9c653cf 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_key.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_key.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_key * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_mpu6050.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_mpu6050.c index dc3c5b2..101a5ae 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_mpu6050.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_mpu6050.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_mpu6050 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_mpu6050.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_mpu6050.h index 3510e06..c8a086f 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_mpu6050.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_mpu6050.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_mpu6050 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_mt9v03x.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_mt9v03x.c index 231cfec..d38b8df 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_mt9v03x.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_mt9v03x.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_mt9v03x * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_mt9v03x.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_mt9v03x.h index 7786bc5..9d4650d 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_mt9v03x.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_mt9v03x.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_mt9v03x * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_oled.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_oled.c index 5314209..55aefa7 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_oled.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_oled.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_oled * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_oled.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_oled.h index d52d2fd..aadf048 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_oled.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_oled.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_oled * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ov7725.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ov7725.c index 12f6095..bac95fe 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ov7725.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ov7725.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ov7725 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ov7725.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ov7725.h index f45a4e8..2cb4026 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ov7725.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ov7725.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ov7725 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_scc8660.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_scc8660.c index 3483c93..38d65ff 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_scc8660.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_scc8660.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_scc8660 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_scc8660.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_scc8660.h index 815d272..537283a 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_scc8660.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_scc8660.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_scc8660 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_tft180.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_tft180.c index db50824..b661e91 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_tft180.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_tft180.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_tft180 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_tft180.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_tft180.h index 47491ee..54a72b3 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_tft180.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_tft180.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_tft180 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_tsl1401.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_tsl1401.c index 3f9db7f..d133c7c 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_tsl1401.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_tsl1401.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_tsl1401 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_tsl1401.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_tsl1401.h index 1fab12e..a7b061c 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_tsl1401.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_tsl1401.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_tsl1401 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_type.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_type.c index 497ba55..af24701 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_type.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_type.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_type * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -32,6 +32,7 @@ * 日期 作者 备注 * 2022-09-15 pudding first version * 2023-05-26 pudding 新增SPI WIFI 中断回调指针 +* 2024-01-16 pudding 移除SPI WIFI 中断回调指针 SPI WIFI将不再使用外部 ********************************************************************************************************************/ #include "zf_device_type.h" @@ -45,7 +46,6 @@ callback_function camera_dma_handler = type_default_callback; wireless_type_enum wireless_type = NO_WIRELESS; callback_function wireless_module_uart_handler = type_default_callback; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 -callback_function wireless_module_spi_handler = type_default_callback; // WIFI SPI GPIO中断函数指针,根据初始化时设置的函数进行跳转 tof_type_enum tof_type = NO_TOF; callback_function tof_module_exti_handler = type_default_callback; // ToF 模块 INT 更新中断 @@ -54,7 +54,7 @@ callback_function tof_module_exti_handler = type_default_callback; // 函数简介 默认回调函数 // 参数说明 void // 返回参数 void -// 使用示例 +// 使用示例 // 备注信息 保护性冗余设计 防止在没有初始化设备的时候跑飞 //------------------------------------------------------------------------------------------------------------------- static void type_default_callback (void) @@ -90,14 +90,7 @@ void set_camera_type (camera_type_enum type_set, callback_function vsync_callba void set_wireless_type (wireless_type_enum type_set, callback_function wireless_callback) { wireless_type = type_set; - if(WIFI_SPI == wireless_type) - { - wireless_module_spi_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); - } - else - { - wireless_module_uart_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); - } + wireless_module_uart_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); } //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_type.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_type.h index 19c36ca..3b124fe 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_type.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_type.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_type * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -56,7 +56,6 @@ typedef enum WIRELESS_UART, // 无线串口 BLUETOOTH_CH9141, // 蓝牙 CH9141 WIFI_UART, // 串口 WiFi - WIFI_SPI // SPI WiFi }wireless_type_enum; typedef enum diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c index 2bdb164..3cbc786 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_virtual_oscilloscope * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h index f518026..b0fd085 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_virtual_oscilloscope * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_wifi_spi.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_wifi_spi.c index 78a6d68..f9e51ca 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_wifi_spi.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_wifi_spi.c @@ -24,14 +24,13 @@ * 文件名称 zf_device_wifi_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 * 日期 作者 备注 -* 2023-05-27 pudding first version -* 2023-05-29 pudding 新增关闭休眠指令,提升通讯效率 +* 2022-09-21 SeekFree first version ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,1374 +52,615 @@ #include "zf_common_clock.h" #include "zf_common_debug.h" #include "zf_common_fifo.h" -#include "zf_common_function.h" #include "zf_driver_delay.h" #include "zf_driver_gpio.h" -#include "zf_common_interrupt.h" -#include "zf_driver_exti.h" #include "zf_driver_spi.h" #include "zf_device_type.h" #include "zf_device_wifi_spi.h" -#define WAIT_TIME_OUT (10000) // 单指令等待时间 单位:ms +#define WIFI_CONNECT_TIME_OUT 10000 // 单位毫秒 +#define SOCKET_CONNECT_TIME_OUT 50000 // 单位毫秒 +#define OTHER_TIME_OUT 1000 // 单位毫秒 -#define WIFI_SPI_WRITE_MAX 128 // 定义一次SPI通讯最大发送的数据长度 - -#define WIFI_SPI_WRITE_REQUEST 0x01 -#define WIFI_SPI_CHECK_STATE 0x02 -#define WIFI_SPI_WRITE_DATA 0x03 -#define WIFI_SPI_READ_DATA 0x04 -#define WIFI_SPI_WRITE_END 0x07 -#define WIFI_SPI_READ_END 0x08 - -#define WIFI_SPI_WRITE_ADDR 0x00 -#define WIFI_SPI_STATE_ADDR 0x04 +char wifi_spi_version[12]; // 保存模块固件版本信息 +char wifi_spi_mac_addr[20]; // 保存模块MAC地址信息 +char wifi_spi_ip_addr_port[25]; // 保存模块IP地址与端口信息 -volatile wifi_spi_buffer_state_enum wifi_buffer_state; -volatile wifi_spi_transmit_state_enum wifi_transmit_state; - -static fifo_obj_struct wifi_spi_fifo; -static uint8 wifi_spi_buffer[WIFI_SPI_BUFFER_SIZE]; // 数据存放数组 - -vuint8 wifi_spi_ack_flag = 0; // 0:模块未应答 1:模块已应答 -uint8 wifi_spi_init_flag; // 0:模块未初始化成功或者未连接 1:模块已连接并成功初始化 -vuint8 wifi_spi_packet_num; // 发送的数据包ID -vuint32 wifi_spi_send_remain_length; // 剩余的发送长度 - - - -wifi_spi_information_struct wifi_spi_information; +static fifo_struct wifi_spi_fifo; +static uint8 wifi_spi_buffer[WIFI_SPI_RECVIVE_FIFO_SIZE]; +static volatile wifi_spi_state_enum wifi_spi_mutex; //------------------------------------------------------------------------------------------------------------------- -// 函数简介 请求写入数据到模块 -// 参数说明 length 需要写入的长度 -// @return void -// Sample usage: +// 函数简介 等待WIFI SPI就绪 +// 参数说明 wait_time 最大等待时间 单位毫秒 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_write_request(uint16 length) +static uint8 wifi_spi_wait_idle (uint32 wait_time) { - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_REQUEST; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - head.magic = 0xFE; - head.sequence = wifi_spi_packet_num++; - head.length = length; + uint32 time = 0; - wifi_transmit_state = TRANSMIT_WRITE_REQUEST; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 7); - gpio_set_level(WIFI_SPI_CS_PIN, 1); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 读取模块状态 -// 参数说明 *length 需要读取或者写入的长度 -// @return WIFI_SPI_BUFFER_STATE_enum 模块状态 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static wifi_spi_buffer_state_enum wifi_spi_read_state(uint16 *length) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_CHECK_STATE; - head.addr = WIFI_SPI_STATE_ADDR; - head.dummy = 0x00; - - wifi_spi_ack_flag = 0; - wifi_transmit_state = TRANSMIT_READ_STATE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_transfer_8bit(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, &head.cmd, 7); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - - if(BUFFER_WRITE == head.magic) + wait_time = wait_time*100; + while(0 == gpio_get_level(WIFI_SPI_INT_PIN)) { - wifi_spi_packet_num = head.sequence; - } - *length = head.length; - - return (wifi_spi_buffer_state_enum)head.magic; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据发送完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_done(void) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_END; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_transmit_state = TRANSMIT_IDLE; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据接收完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_start(void) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_READ_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - wifi_transmit_state = TRANSMIT_READ; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据接收完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_done(void) -{ - wifi_spi_buffer_struct head; - - gpio_set_level(WIFI_SPI_CS_PIN, 1); - - head.cmd = WIFI_SPI_READ_END; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_transmit_state = TRANSMIT_IDLE; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块 -// 参数说明 *buff 需要写入数据的首地址 -// 参数说明 length 需要写入数据的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_data(const uint8 *buff, uint16 length) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - wifi_transmit_state = TRANSMIT_WRITE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - spi_write_8bit_array(WIFI_SPI_INDEX, buff, length); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_spi_send_done(); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_data_multi(wifi_spi_send_multi_struct *multi_buffer) -{ - uint8 i; - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - wifi_transmit_state = TRANSMIT_WRITE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - - for(i = 0; i < WIFI_SPI_MAX_MULTI; i++) - { - if(NULL != multi_buffer->source[i]) spi_write_8bit_array(WIFI_SPI_INDEX, multi_buffer->source[i], multi_buffer->length[i]); - } - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_spi_send_done(); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 接收模块发送的数据 -// 参数说明 *buff 接收数组的缓冲区首地址 -// 参数说明 length 需要接收的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_data(uint8 *buff, uint16 length) -{ - spi_read_8bit_array(WIFI_SPI_INDEX, buff, length); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送命令到模块 -// 参数说明 *str 命令字符串首地址 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_command(const char *str) -{ - uint8 state = 0; - uint16 send_length; - uint16 wait_time = 0; - - // 请求发送数据 - send_length = (uint16)strlen(str); - - // 等待传输进入空闲 - while(TRANSMIT_IDLE != wifi_transmit_state); - - // 如果没有进入发送状态则重新请求发送数据 - while(BUFFER_WRITE != wifi_buffer_state) - { - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - while(!wifi_spi_ack_flag) - { - wait_time++; - if((WAIT_TIME_OUT / 4) <= wait_time) - { - state = 1; - wifi_spi_init_flag = 0; // 模块已断开 - break; - } - system_delay_ms(1); - } - - if(1 == state) + system_delay_us(10); + time++; + if(wait_time <= time) { break; } } - - wifi_buffer_state = BUFFER_IDLE; - - if(0 == state) // 通讯未超时 - { - wifi_spi_send_remain_length = send_length; - // 发送消息 - wifi_spi_send_data((const uint8 *)str, send_length); - } + return (wait_time <= time); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 检查模块状态并读取模块发送的数据 -// 参数说明 void -// @return void -// Sample usage: +// 函数简介 写入数据到WIFI SPI +// 参数说明 *buffer1 第一组需要发送的数据缓冲区地址 +// 参数说明 length1 第一组数据长度 +// 参数说明 *buffer2 第二组需要发送的数据缓冲区地址 +// 参数说明 length2 第二组数据长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -void wifi_spi_check_state_read_buffer(void) +static void wifi_spi_write (const uint8 *buffer1, uint16 length1, const uint8 *buffer2, uint16 length2) { - uint16 wifi_spi_receive_length; // 本次接收到的数据数量 - uint8 wifi_spi_receive_buffer[WIFI_SPI_WRITE_MAX]; - - // 查询WIFI模块的状态 - wifi_buffer_state = wifi_spi_read_state(&wifi_spi_receive_length); - - // 如果需要读取WIFI模块数据,则保存需要读取的长度 - if(BUFFER_READ == wifi_buffer_state) + gpio_low(WIFI_SPI_CS_PIN); + if(NULL != buffer1) { - wifi_spi_receive_start(); - do - { - if(wifi_spi_receive_length > WIFI_SPI_WRITE_MAX) - { - wifi_spi_receive_data((uint8 *)wifi_spi_receive_buffer, WIFI_SPI_WRITE_MAX); - fifo_write_buffer(&wifi_spi_fifo, wifi_spi_receive_buffer, WIFI_SPI_WRITE_MAX); // 存入 FIFO - wifi_spi_receive_length = wifi_spi_receive_length - WIFI_SPI_WRITE_MAX; - } - else - { - wifi_spi_receive_data((uint8 *)wifi_spi_receive_buffer, wifi_spi_receive_length); - fifo_write_buffer(&wifi_spi_fifo, wifi_spi_receive_buffer, wifi_spi_receive_length); // 存入 FIFO - wifi_spi_receive_length = 0; - } - }while(wifi_spi_receive_length > 0); - wifi_spi_receive_done(); + spi_write_8bit_array(WIFI_SPI_INDEX, buffer1, length1); } - else if(BUFFER_IDLE == wifi_buffer_state) + if(NULL != buffer2) { - // 如果模块内部缓冲区状态为空闲,则传输状态也设置为空闲 - wifi_transmit_state = TRANSMIT_IDLE; + spi_write_8bit_array(WIFI_SPI_INDEX, buffer2, length2); } + gpio_high(WIFI_SPI_CS_PIN); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块 -// 参数说明 *buff 需要发送的数据首地址 -// 参数说明 length 需要发送的长度 -// @return uint32 剩余未发送长度 -// Sample usage: +// 函数简介 WIFI SPI 发送与接收同时进行(命令收发) +// 参数说明 *packets 发送与接收的地址 +// 参数说明 length 需要接收的长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_write_data(const uint8 *buff, uint32 length) +static void wifi_spi_transfer_command (wifi_spi_packets_struct *packets, uint16 length) { - uint16 send_length; - uint32 wait_time; + gpio_low(WIFI_SPI_CS_PIN); - // 记录需要发送的长度 - wifi_spi_send_remain_length = length; - - while(wifi_spi_send_remain_length) + spi_transfer_8bit(WIFI_SPI_INDEX, (uint8 *)&(packets->head), (uint8 *)&(packets->head), sizeof(wifi_spi_head_struct)); + + if(length) { - send_length = (uint16)func_limit_ab(wifi_spi_send_remain_length, 1, WIFI_SPI_WRITE_MAX); - - // 请求发送数据 - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - - // 最长等待5秒 - wait_time = 5000; - while(!wifi_spi_ack_flag) - { - wait_time--; - if(0 == wait_time) break; - system_delay_ms(1); - } - - if(BUFFER_WRITE == wifi_buffer_state) - { - // 发送消息 - wifi_spi_send_data(buff, send_length); - buff += send_length; - wifi_spi_send_remain_length -= send_length; - wifi_buffer_state = BUFFER_IDLE; - } - else - { - break; - } + spi_transfer_8bit(WIFI_SPI_INDEX, (const uint8 *)(packets->buffer), packets->buffer, length); } - - return wifi_spi_send_remain_length; + + gpio_high(WIFI_SPI_CS_PIN); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// @return uint32 剩余未发送长度 -// Sample usage: 发送数据总长度不能超过4092个 +// 函数简介 WIFI SPI 发送与接收同时进行(数据收发) +// 参数说明 *write_data 发送的数据缓冲区地址 +// 参数说明 *read_data 接收到的数据的存储地址 +// 参数说明 length 需要接收的长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_write_data_multi(wifi_spi_send_multi_struct *multi_buffer) +static void wifi_spi_transfer_data (const uint8 *write_data, wifi_spi_packets_struct *read_data, uint16 length) { - uint16 send_length; - uint32 wait_time; + gpio_low(WIFI_SPI_CS_PIN); - // 记录需要发送的长度 - send_length = multi_buffer->length[0] + multi_buffer->length[1] + multi_buffer->length[2] + multi_buffer->length[3] + multi_buffer->length[4] + multi_buffer->length[5] + multi_buffer->length[6] + multi_buffer->length[7]; + read_data->head.command = WIFI_SPI_DATA; + read_data->head.length = length; - if(WIFI_SPI_WRITE_MAX >= send_length) + spi_transfer_8bit(WIFI_SPI_INDEX, (uint8 *)&(read_data->head), (uint8 *)&(read_data->head), sizeof(wifi_spi_head_struct)); + + if(WIFI_SPI_RECVIVE_SIZE < length) { - // 请求发送数据 - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - - // 最长等待5秒 - wait_time = 5000; - while(!wifi_spi_ack_flag) - { - wait_time--; - if(0 == wait_time) break; - system_delay_ms(1); - } - - if(BUFFER_WRITE == wifi_buffer_state) - { - // 发送消息 - wifi_spi_send_data_multi(multi_buffer); - send_length = 0; - wifi_buffer_state = BUFFER_IDLE; - } + spi_transfer_8bit(WIFI_SPI_INDEX, write_data, read_data->buffer, WIFI_SPI_RECVIVE_SIZE); + spi_write_8bit_array(WIFI_SPI_INDEX, &write_data[WIFI_SPI_RECVIVE_SIZE], length - WIFI_SPI_RECVIVE_SIZE); } - - return send_length; + else + { + // 将需要发送的数据拷贝到读取缓冲区,避免出现write_data越界访问 + memcpy(read_data->buffer, write_data, length); + spi_transfer_8bit(WIFI_SPI_INDEX, read_data->buffer, read_data->buffer, WIFI_SPI_RECVIVE_SIZE); + } + gpio_high(WIFI_SPI_CS_PIN); } -//-------------------------------------------------------------------------------------------------- -// 函数简介 等待模块响应 -// 参数说明 *wait_buffer 等待的响应的字符串 -// 参数说明 timeout 超时时间 -// 返回参数 uint8 0:模块响应指定数据 1:模块未响应指定数据或超时 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_wait_ack (char *wait_buffer, uint32 timeout) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 参数设置 +// 参数说明 command 命令类型 +// 参数说明 *buffer 参数地址 +// 参数说明 length 参数长度 +// 参数说明 wait_time 最大等待时间 单位100微妙 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_set_parameter (wifi_spi_packets_command_enum command, uint8 *buffer, uint16 length, uint32 wait_time) { - uint8 return_state = 1; - char receiver_buffer[8] = {0, 0, 0, 0, 0, 0, 0, 0}; - uint32 receiver_len = 8; - + uint8 return_state; + wifi_spi_head_struct head; + return_state = 1; do { - system_delay_ms(1); - // 判断接收缓冲区内是否有需要响应的指定数据 如果有 则跳出循环并且返回0 - receiver_len = 8; - fifo_read_tail_buffer(&wifi_spi_fifo, (uint8 *)receiver_buffer, &receiver_len, FIFO_READ_ONLY); + head.command = command; + head.length = length; + + // 等待从机准备就绪 + if(wifi_spi_wait_idle(wait_time)) + { + break; + } - if(strstr(receiver_buffer, wait_buffer)) + wifi_spi_write(&head.command, sizeof(wifi_spi_head_struct), buffer, length); + if(wifi_spi_wait_idle(wait_time)) + { + break; + } + // 接收应答信号 + + head.command = WIFI_SPI_DATA; + head.length = 0; + wifi_spi_transfer_command((wifi_spi_packets_struct *)&head, head.length); + system_delay_us(20); + if(WIFI_SPI_REPLY_OK == head.command) { return_state = 0; - break; } - else if(strstr(receiver_buffer, "ERROR") || strstr(receiver_buffer, "busy")) - { - // 如果接收到报错或者模块忙 则跳出循环并且返回1 - return_state = 1; - break; - } - }while(timeout --); + }while(0); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 清除WiFi接收缓冲区内容 -// 参数说明 void -// 返回参数 void -// 使用示例 wifi_spi_clear_receive_buffer(); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static void wifi_spi_clear_receive_buffer (void) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 模块信息获取 +// 参数说明 command 命令类型 +// 参数说明 *buffer 保存接收到的参数地址 +// 参数说明 wait_time 最大等待时间 单位100微妙 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_parameter (wifi_spi_packets_command_enum command, wifi_spi_packets_struct *read_data, uint32 wait_time) { - // 清空WiFi接收缓冲区 - fifo_clear(&wifi_spi_fifo); -} + uint8 return_state; -//-------------------------------------------------------------------------------------------------- -// 函数简介 模块数据解析 -// 参数说明 *target_buffer 目标存放地址指针 字符串数组 -// 参数说明 *origin_buffer 数据来源地址指针 字符串数组 -// 参数说明 start_char 起始提取字节 例如从 "1234" 中从 '2' 开始提取 就应该填入 '2' -// 参数说明 end_char 结束提取字节 例如从 "1234" 中在 '4' 结束提取 就应该填入 '\0'(0x00 空字符 一般是字符串结尾) -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_data_parse(wifi_spi_information.mac, wifi_spi_receive_buffer, '"', '"'); // 调用获取本机mac地址后,调用此函数提取mac地址 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char start_char, char end_char) -{ - uint8 return_state = 0; - char *location1; - char *location2; - location1 = strchr((char *)origin_buffer, start_char); - if(location1) + return_state = 1; + do { - location1 ++; - location2 = strchr(location1, end_char); - if(location2) + // 等待从机准备就绪 + if(wifi_spi_wait_idle(wait_time)) { - memcpy(target_buffer, location1, location2-location1); + break; } - else + read_data->head.command = command; + wifi_spi_write(&(read_data->head.command), WIFI_SPI_RECVIVE_SIZE, NULL, 0); + + if(wifi_spi_wait_idle(wait_time)) { - return_state = 1; + break; } - } - else - { - return_state = 1; - } + read_data->head.command = WIFI_SPI_DATA; + read_data->head.length = 0; + wifi_spi_transfer_command(read_data, WIFI_SPI_RECVIVE_SIZE); + return_state = 0; + }while(0); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 查看模块版本信息 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_get_version(); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 固件版本获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,固件版本信息以字符串形式保存在wifi_spi_version数组中 +//------------------------------------------------------------------------------------------------------------------- static uint8 wifi_spi_get_version (void) { - char *location1; - uint8 return_state = 0; - uint8 receiver_buffer[256]; - uint32 receiver_len = 256; + uint8 return_state; + wifi_spi_packets_struct temp_packets; - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+GMR\r\n"); - do + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_VERSION, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_VERSION == temp_packets.head.command)) { - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - location1 = strrchr((char *)receiver_buffer, ':'); - if(wifi_spi_data_parse(wifi_spi_information.version, (uint8 *)location1, ':', '(')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - + memcpy(wifi_spi_version, temp_packets.buffer, temp_packets.head.length); + } return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 模块回显设置 -// 参数说明 model 0:关闭模块的回写功能 其他:开启模块回写 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_echo_set("1");//开启模块回写功能 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_echo_set (char *model) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI MAC地址获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,MAC地址信息以字符串形式保存在wifi_spi_mac_addr数组中 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_mac_addr (void) { - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - if('1' == *model) + uint8 return_state; + wifi_spi_packets_struct temp_packets; + + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_MAC_ADDR, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_MAC_ADDR == temp_packets.head.command)) { - wifi_spi_send_command("ATE1\r\n"); + memcpy(wifi_spi_mac_addr, temp_packets.buffer, temp_packets.head.length); + } + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI IP地址与端口号获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 +// 需要在连接Socket之后调用此函数才能正常获取信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_ip_addr_port (void) +{ + uint8 return_state; + wifi_spi_packets_struct temp_packets; + + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_IP_ADDR, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_IP_ADDR == temp_packets.head.command)) + { + memcpy(wifi_spi_ip_addr_port, temp_packets.buffer, temp_packets.head.length); + } + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 设置连接的WiFi信息并尝试连接WiFi +// 参数说明 *wifi_ssid WIFI名称 +// 参数说明 *pass_word WIFI密码 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_wifi_connect("SEEKFREE", "SEEKFREE123"); +// 备注信息 wifi_spi_wifi_connect("SEEKFREE", NULL); // 连接没有密码的WIFI热点 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_wifi_connect (char *wifi_ssid, char *pass_word) +{ + uint8 return_state; + uint8 temp_buffer[64]; + uint16 length; + + if(NULL != pass_word) + { + // WIFI热点有密码发送热点名称与密码 + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n%s\r\n", wifi_ssid, pass_word); } else { - wifi_spi_send_command("ATE0\r\n"); + // WIFI热点没有密码只需要发送热点名称 + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n", wifi_ssid); } - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + return_state = wifi_spi_set_parameter(WIFI_SPI_SET_WIFI_INFORMATION, temp_buffer, length, WIFI_CONNECT_TIME_OUT); + + // 本机IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 + wifi_spi_get_ip_addr_port(); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块自身 的 MAC 地址 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_mac()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_mac (void) -{ - uint8 return_state = 0; - uint8 receiver_buffer[64]; - uint32 receiver_len = 64; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPAPMAC?\r\n"); - do - { - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - if(wifi_spi_data_parse(wifi_spi_information.mac, receiver_buffer, '"', '"')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块或者目标WIFI 的 IP 地址(取决于模块当前的工作模式) -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_ip()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_ip (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_STATION == wifi_spi_information.mode) - { - wifi_spi_send_command("AT+CIPSTA?\r\n"); - } - else if(WIFI_SPI_SOFTAP == wifi_spi_information.mode) - { - wifi_spi_send_command("AT+CIPAP?\r\n"); - } - - do - { - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - uint8 receiver_buffer[128]; - uint32 receiver_len = 128; - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - if(wifi_spi_data_parse(wifi_spi_information.local_ip, receiver_buffer, '"', '"')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块的相关信息 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_information()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_information (void) -{ - uint8 return_state = 0; - do - { - // 获取模块版本号 - if(wifi_spi_get_version()) - { - return_state = 1; - break; - } - // 获取模块IP地址 - if(wifi_spi_get_ip()) - { - return_state = 1; - break; - } - // 获取模块MAC信息 - if(wifi_spi_get_mac()) - { - return_state = 1; - break; - } - memcpy(wifi_spi_information.local_port, "no port", 7); - }while(0); - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 连接 WiFi -// 参数说明 wifi_ssid WiFi名称 -// 参数说明 pass_word WiFi密码 -// 参数说明 model 0:查询WiFi连接情况 其他:连接WiFi -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_get_or_connect_wifi("WiFi_name", "Pass_word", 1); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_wifi (char *wifi_ssid, char *pass_word) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SOFTAP == wifi_spi_information.mode) - { - sprintf(temp, "AT+CWSAP=\"%s\",\"%s\",5,3\r\n", wifi_ssid, pass_word); - wifi_spi_send_command(temp); - } - else - { - sprintf(temp, "AT+CWJAP=\"%s\",\"%s\"\r\n", wifi_ssid, pass_word); - wifi_spi_send_command(temp); - } - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 上电是否自动连接WiFi -// 参数说明 model 0:上电不自动连接wifi 其他:上电自动连接wifi -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_auto_connect_wifi(0); //上电不自动连接wifi -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_auto_connect_wifi (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CWAUTOCONN=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置连接模式 -// 参数说明 model 0: 单连接模式 1:多连接模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_connect_model("1"); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_connect_model (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPMUX=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置传输模式 -// 参数说明 model – 0: 普通传输模式 IP断开后不重新连接 -// – 1: Wi-Fi 透传接收模式,仅支持 TCP 单连接、UDP 固定通信对端、SSL 单连接的情况 IP断开后会不断尝试重新连接 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_transfer_model("1"); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_transfer_model (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPMODE=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置模块模式 (Station/SoftAP/Station+SoftAP) -// 参数说明 state 0:无 Wi-Fi 模式,并且关闭 Wi-Fi RF----1: Station 模式----2: SoftAP 模式----3: SoftAP+Station 模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_model("1"); +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 设置连接的Socket信息并尝试连接Socket +// 参数说明 *transport_type 传输类型 +// 参数说明 *ip_addr IP地址 +// 参数说明 *port 目标端口号 +// 参数说明 *local_port 本机端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_socket_connect("TCP", "192.168.2.5", "8080", "6060"); // 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_set_model (wifi_spi_mode_enum mode) +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_socket_connect (char *transport_type, char *ip_addr, char *port, char *local_port) { - uint8 return_state = 0; + uint8 return_state; + uint8 temp_buffer[41]; + uint16 length; + + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n%s\r\n%s\r\n%s\r\n", transport_type, ip_addr, port, local_port); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + return_state = wifi_spi_set_parameter(WIFI_SPI_SET_SOCKET_INFORMATION, temp_buffer, length, SOCKET_CONNECT_TIME_OUT); - if(WIFI_SPI_SOFTAP == mode) - { - wifi_spi_send_command("AT+CWMODE=2\r\n"); - } - else - { - wifi_spi_send_command("AT+CWMODE=1\r\n"); - } - // 设置模块工作模式 - wifi_spi_information.mode = mode; - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + // 本机IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 + wifi_spi_get_ip_addr_port(); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 关闭睡眠模式 -// 参数说明 mode -// 返回参数 uint8 0:成功 1:失败 +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 断开Socket连接 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_socket_disconnect(); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_socket_disconnect (void) +{ + wifi_spi_packets_struct temp_packets; + + return wifi_spi_get_parameter(WIFI_SPI_CLOSE_SOCKET, &temp_packets, OTHER_TIME_OUT); +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 软复位 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 // 使用示例 // 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_close_sleep_model (void) +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_reset (void) { - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+SLEEP=0\r\n"); - // 设置模块工作模式 - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 断开与wifi的连接 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_disconnected_wifi(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_disconnected_wifi (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CWQAP\r\n"); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 进入打开透传模式 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_entry_serianet(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_entry_serianet (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPSEND\r\n"); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 退出透传模式 -// 参数说明 model 0:关闭透传模式 其他:开启透传模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_exit_serianet(1); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_exit_serianet (void) -{ - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - system_delay_ms(20); - wifi_spi_send_command("+++"); - system_delay_ms(1000); - - return 0; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 建立TCP连接 -// 参数说明 ip 远端 IPv4 地址、IPv6 地址,或域名 -// 参数说明 port 远端端口值 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_connect_tcp_servers("192.168.101.110", "8080"); -// 备注信息 如果总是连接不上电脑的TCP服务器 可以尝试使用网线连接电脑 -// 如果是使用WiFi连接 可能会导致模块连接TCP服务器等待较长时间 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_connect_tcp_servers (char *ip, char *port, wifi_spi_transfer_mode_enum mode) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + uint8 return_state; + wifi_spi_head_struct head; + return_state = 1; do { - if(wifi_spi_set_connect_model("0")) + head.command = WIFI_SPI_RESET; + head.length = 0xA5A5; + return_state = wifi_spi_wait_idle(OTHER_TIME_OUT); + if(return_state) { - return_state = 1; break; } + wifi_spi_write(&head.command, sizeof(wifi_spi_head_struct), NULL, 0); + }while(0); + + return return_state; +} - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPSTARTEX=\"TCP\",\"%s\",%s\r\n", ip, port); - wifi_spi_send_command(temp); - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI UDP模式时立即发送函数 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 在UDP模式下模块收到数据后会等待2毫秒,2毫秒后未收到数据则将数据通过socket发送到网络,如果希望立即发送则在数据传输完毕后调用此函数 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_udp_send_now (void) +{ + uint8 return_state = 1; + wifi_spi_packets_struct temp_packets; + + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + do { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - // 设置传输模式 - if(wifi_spi_set_transfer_model(WIFI_SPI_COMMAND == mode ? "0" : "1")) - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPSTATE?\r\n"); - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - else - { - uint8 receiver_buffer[128]; - uint32 receiver_len = 128; - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - char* buffer_index = (char *)receiver_buffer; - char* end_index; - - buffer_index += 22; - buffer_index += strlen(ip); - buffer_index += strlen(port); - end_index = strchr(buffer_index, ','); - - memcpy(wifi_spi_information.local_port, " ", 7); - memcpy(wifi_spi_information.local_port, buffer_index, (end_index - buffer_index)); - } - - wifi_spi_information.connect_state = WIFI_SPI_SERVER_ON; - wifi_spi_information.connect_mode = WIFI_SPI_TCP_CLIENT; - wifi_spi_information.transfer_mode = mode; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SERIANET == mode) // 透传模式下直接开启透传 - { - if(wifi_spi_entry_serianet()) + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) { - return_state = 1; break; } - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 建立UDP连接 -// 参数说明 *ip 远端 IPv4 地址、IPv6 地址 或域名 字符串形式 -// 参数说明 *port 远端端口值 字符串形式 -// 参数说明 *local_port 远端 IPv4 地址、IPv6 地址 或域名 字符串形式 -// 参数说明 mode 模块数据通信模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_connect_udp_client("192.168.101.110", "8080", "8080", WIFI_SPI_COMMAND); -// 备注信息 自动分配ID -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_connect_udp_client (char *ip, char *port, char *local_port, wifi_spi_transfer_mode_enum mode) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - do - { - if(wifi_spi_set_connect_model("0")) - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + // 立即开始socket发送 + temp_packets.head.command = WIFI_SPI_UDP_SEND; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + + // 等待应答信号 + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + + // 接收应答信号 + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, temp_packets.head.length); + + if(WIFI_SPI_REPLY_OK == temp_packets.head.command) + { + return_state = 0; + } + + }while(0); - sprintf(temp, "AT+CIPSTARTEX=\"UDP\",\"%s\",%s,%s\r\n", ip, port, local_port); - wifi_spi_send_command(temp); + // 将通讯状态设置为空闲 + wifi_spi_mutex = WIFI_SPI_IDLE; + } + + return return_state; +} - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 数据块发送函数并同步接收数据 +// 参数说明 *buff 需要发送的数据地址 +// 参数说明 length 发送长度 +// 返回参数 uint32 剩余未发送的长度 +// 使用示例 wifi_spi_send_buffer(buffer, 100); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +uint32 wifi_spi_send_buffer (const uint8 *buffer, uint32 length) +{ + uint16 send_length; + wifi_spi_packets_struct temp_packets; + + // 检查WIFI SPI状态,如果在其他中断或者线程中已经发起了通讯,则本次不能发送数据 + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + + while(length) { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_spi_set_transfer_model(WIFI_SPI_COMMAND == mode ? "0" : "1")) // 设置传输模式 - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SERIANET == mode) // 透传模式下直接开启透传 - { - if(wifi_spi_entry_serianet()) + send_length = length > WIFI_SPI_TRANSFER_SIZE ? (uint16)WIFI_SPI_TRANSFER_SIZE : (uint16)length; + + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) { - return_state = 1; break; } - } - memcpy(wifi_spi_information.local_port, " ", 7); - memcpy(wifi_spi_information.local_port, local_port, strlen(local_port)); - wifi_spi_information.connect_state = WIFI_SPI_SERVER_ON; - wifi_spi_information.connect_mode = WIFI_SPI_UDP_CLIENT; - wifi_spi_information.transfer_mode = mode; - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 断开连接 TCP Server 使用本接口将会断开所有连接 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_disconnect_link(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_disconnect_link (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - do - { - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - wifi_spi_send_command("AT+CIPCLOSE=5\r\n"); - } - else - { - wifi_spi_send_command("AT+CIPCLOSE\r\n"); - } - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送字节函数 -// 参数说明 data 需要发送的数据 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_byte(0xa5); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_byte (uint8 data) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - send_length = 1; - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data(&data, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else - { - send_length = (uint16)wifi_spi_write_data(&data, send_length); - } - } - } - - return send_length; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送缓冲区函数 -// 参数说明 buff 需要发送的数据地址 -// 参数说明 len 发送长度 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_buffer("123", 3); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 len) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - while(len) - { - if((WIFI_SPI_WRITE_MAX * 2) < len) send_length = WIFI_SPI_WRITE_MAX * 2; - else - { - send_length = (uint16)len; - } - len -= send_length; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data(buff, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } - buff += send_length; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else - { - len = wifi_spi_write_data(buff, len); - } - } - } - - return len; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送缓冲区函数(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 -// 备注信息 需要发送多个数组时,采用此函数可以极大的降低通讯时间,发送数据总长度不能超过4092 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_buffer_multi (wifi_spi_send_multi_struct *multi_buffer) -{ - uint8 i; - uint16 remain_length; - - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - for(i = 0; i < WIFI_SPI_MAX_MULTI; i++) - { - if(multi_buffer->source[i]) wifi_spi_send_buffer(multi_buffer->source[i], multi_buffer->length[i]); - } - } - else - { - remain_length = (uint16)wifi_spi_write_data_multi(multi_buffer); - } - } - } - - return remain_length; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送字符串函数 -// 参数说明 *str 需要发送的数据 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_string("123"); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_string (const char *str) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - send_length = (uint16)strlen(str); - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data((uint8 *)str, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } + wifi_spi_transfer_data(buffer, &temp_packets, send_length); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) { - send_length = (uint16)wifi_spi_write_data((uint8 *)str, send_length); + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + + length -= send_length; + buffer += send_length; + } + + // 检查最后一次的接收是否将所有的数据都接收完毕 + while(WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) + { + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + + // 继续读取模块剩余数据 + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } } } + wifi_spi_mutex = WIFI_SPI_IDLE; } - - return send_length; + return length; } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi 模块数据接收函数 -// 参数说明 buffer 接收数据的存放地址 -// 参数说明 len 数组长度,可直接填写或者使用sizeof求得 -// 返回参数 uint32 返回实际接收到的数据长度 -// 使用示例 uint8 test_buffer[256]; wifi_spi_read_buffer(&test_buffer[0], sizeof(test_buffer)); +// 函数简介 WIFI SPI 读取缓冲区 +// 参数说明 *buff 接收缓冲区 +// 参数说明 length 读取数据长度 +// 返回参数 uint32 实际读取数据长度 +// 使用示例 wifi_spi_read_buffer(buffer, 100); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 len) +uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 length) { - fifo_read_buffer(&wifi_spi_fifo, buffer, &len, FIFO_READ_AND_CLEAN); - return len; + zf_assert(NULL != buffer); + uint32 data_len = length; + +#if(1 == WIFI_SPI_READ_TRANSFER) + + wifi_spi_packets_struct temp_packets; + // 检查WIFI SPI状态,如果在其他中断或者线程中已经发起了通讯,则本次不能发送数据 + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + + // 发起通讯查看模块内是否有数据未读取 + do + { + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + }while(WIFI_SPI_REPLY_DATA_START == temp_packets.head.command); + wifi_spi_mutex = WIFI_SPI_IDLE; + } +#endif + + fifo_read_buffer(&wifi_spi_fifo, buffer, &data_len, FIFO_READ_AND_CLEAN); + return data_len; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 wifi spi handshake中断回调函数 -// 参数说明 void -// 返回参数 void -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -void wifi_spi_callback (void) -{ - wifi_spi_check_state_read_buffer(); - wifi_spi_ack_flag = 1; // ACK标志位置1 -} - - //------------------------------------------------------------------------------------------------------------------- // 函数简介 WiFi 模块初始化 // 参数说明 *wifi_ssid 目标连接的 WiFi 的名称 字符串形式 // 参数说明 *pass_word 目标连接的 WiFi 的密码 字符串形式 -// 参数说明 wifi_mode 模块的工作模式 参照 zf_device_wireless_spi.h 中 wifi_spi_mode_enum 枚举 // 返回参数 uint8 模块初始化状态 0-成功 1-错误 -// 使用示例 wifi_spi_init("SEEKFREE_2.4G", "SEEKFREEV2", WIFI_UART_STATION); -// 备注信息 初始化会首先设置串口配置,之后会对模块进行基本参数配置 -// 具体的配置信息可以在 zf_device_wireless_spi.h 文件中修改 +// 使用示例 wifi_spi_init("SEEKFREE", "SEEKFREE123"); +// 备注信息 wifi_spi_init("SEEKFREE", NULL); // 连接没有密码的WIFI热点 //------------------------------------------------------------------------------------------------------------------- -uint8 wifi_spi_init (char *wifi_ssid, char *pass_word, wifi_spi_mode_enum wifi_mode) +uint8 wifi_spi_init (char *wifi_ssid, char *pass_word) { uint8 return_state = 0; - uint32 temp_isr; - - spi_init(WIFI_SPI_INDEX, SPI_MODE0, WIFI_SPI_SPEED, WIFI_SPI_SCK_PIN, WIFI_SPI_MOSI_PIN, WIFI_SPI_MISO_PIN, SPI_CS_NULL);//硬件SPI初始化 - set_wireless_type(WIFI_SPI, wifi_spi_callback); - fifo_init(&wifi_spi_fifo, FIFO_DATA_8BIT, wifi_spi_buffer, WIFI_SPI_BUFFER_SIZE); + fifo_init(&wifi_spi_fifo, FIFO_DATA_8BIT, wifi_spi_buffer, WIFI_SPI_RECVIVE_FIFO_SIZE); + spi_init(WIFI_SPI_INDEX, SPI_MODE3, WIFI_SPI_SPEED, WIFI_SPI_SCK_PIN, WIFI_SPI_MOSI_PIN, WIFI_SPI_MISO_PIN, SPI_CS_NULL);//硬件SPI初始化 gpio_init(WIFI_SPI_CS_PIN, GPO, 1, GPO_PUSH_PULL); gpio_init(WIFI_SPI_RST_PIN, GPO, 1, GPO_PUSH_PULL); - - temp_isr = interrupt_global_disable(); - - exti_init(WIFI_SPI_INT_PIN, EXTI_TRIGGER_RISING); - + gpio_init(WIFI_SPI_INT_PIN, GPI, 0, GPI_PULL_DOWN); + + // 复位 gpio_set_level(WIFI_SPI_RST_PIN, 0); - system_delay_ms(50); + system_delay_ms(10); gpio_set_level(WIFI_SPI_RST_PIN, 1); - system_delay_ms(1000); + + // 等待模块初始化 + system_delay_ms(100); + wifi_spi_mutex = WIFI_SPI_IDLE; - exti_flag_clear(WIFI_SPI_INT_PIN); - - interrupt_global_enable(temp_isr); do { - if(wifi_spi_echo_set("0")) // 关闭模块回写 + // 固件版本信息以字符串形式保存在wifi_spi_version数组中 + return_state = wifi_spi_get_version(); + if(return_state) + { + break; + } + + // MAC地址信息以字符串形式保存在wifi_spi_mac_addr数组中 + wifi_spi_get_mac_addr(); + + + return_state = wifi_spi_wifi_connect(wifi_ssid, pass_word); + if(return_state) { - zf_log(0, "exit echo failed"); - return_state = 1; break; } - if(wifi_spi_auto_connect_wifi("0")) // 关闭自动连接 + #if(1 == WIFI_SPI_AUTO_CONNECT) + return_state = wifi_spi_socket_connect("TCP", WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT); + if(return_state) { - zf_log(0, "close auto connect failed"); - return_state = 1; break; } - - if(wifi_spi_set_model(wifi_mode)) // 设置运行模式 + #endif + + #if(2 == WIFI_SPI_AUTO_CONNECT) + return_state = wifi_spi_socket_connect("UDP", WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT); + if(return_state) { - zf_log(0, "set run mode failed"); - return_state = 1; break; } - - if(wifi_spi_close_sleep_model()) // 关闭睡眠模式 - { - zf_log(0, "set sleep mode failed"); - return_state = 1; - break; - } - - if(wifi_spi_set_wifi((char *)wifi_ssid, (char *)pass_word)) // 连接 wifi 或者开启热点 - { - zf_log(0, "wifi set failed"); - return_state = 1; - break; - } - - if(wifi_spi_get_information()) // 模块基本参数获取 - { - zf_log(0, "get module information failed"); - return_state = 1; - break; - } -#if WIFI_SPI_AUTO_CONNECT == 1 - if(wifi_spi_connect_tcp_servers(WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_SERIANET)) // 连接TCP服务器 - { - zf_log(0, "connect TCP server failed"); - return_state = 1; - break; - } -#endif -#if WIFI_SPI_AUTO_CONNECT == 2 - if(wifi_spi_connect_udp_client(WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT, WIFI_SPI_SERIANET)) // 建立UDP连接 - { - zf_log(0, "connect UDP server failed"); - return_state = 1; - break; - } -#endif - // 模块初始化成功 - wifi_spi_init_flag = 1; + #endif }while(0); - + return return_state; } diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_wifi_spi.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_wifi_spi.h index 5e5a025..24e7eb1 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_wifi_spi.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_wifi_spi.h @@ -24,13 +24,13 @@ * 文件名称 zf_device_wifi_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 * 日期 作者 备注 -* 2023-05-27 pudding first version +* 2024-01-18 SeekFree first version ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,128 +53,100 @@ #include "zf_common_typedef.h" + #define WIFI_SPI_INDEX (SPI_3 ) // 定义使用的SPI号 -#define WIFI_SPI_SPEED (30 * 1000 * 1000 ) // 硬件 SPI 速率 +#define WIFI_SPI_SPEED (50 * 1000 * 1000 ) // 硬件 SPI 速率 #define WIFI_SPI_SCK_PIN (SPI3_SCLK_P22_3 ) // 定义SPI_SCK引脚 #define WIFI_SPI_MOSI_PIN (SPI3_MOSI_P22_0 ) // 定义SPI_MOSI引脚 #define WIFI_SPI_MISO_PIN (SPI3_MISO_P22_1 ) // 定义SPI_MISO引脚 IPS没有MISO引脚,但是这里任然需要定义,在spi的初始化时需要使用 #define WIFI_SPI_CS_PIN (P22_2 ) // 定义SPI_CS引脚 采用软件CS引脚 -#define WIFI_SPI_INT_PIN (ERU_CH5_REQ1_P15_8) // 定义中断引脚 +#define WIFI_SPI_INT_PIN (P15_8 ) // 定义握手引脚 #define WIFI_SPI_RST_PIN (P23_1 ) // 定义复位引脚 - - -#define WIFI_SPI_BUFFER_SIZE (1024) // 定义SPI接收的缓冲区大小 -#define WIFI_SPI_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不连接 1-自动连接TCP服务器并进入透传模式 2-自动连接UDP服务器并进入透传模式 3:自动建立TCP服务器 - -#if (WIFI_SPI_AUTO_CONNECT > 2) + +#define WIFI_SPI_RECVIVE_FIFO_SIZE (1024) // 接收FIFO大小 +#define WIFI_SPI_READ_TRANSFER (1) // 在调用wifi_spi_read_buffer 是否尝试发起SPI通讯来检测模块内是否有数据需要读取 1:发起SPI通讯 0:不发起SPI通讯,仅读取FIFO + // 如果应用程序中没有任何的地方调用发送函数,则WIFI_SPI_READ_TRANSFER必须设置为1 + +#define WIFI_SPI_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不自动连接 1-自动连接TCP服务器 2-自动连接UDP + +#if (WIFI_SPI_AUTO_CONNECT > 2) #error "WIFI_SPI_AUTO_CONNECT 的值只能为 [0,1,2]" #else -#define WIFI_SPI_TARGET_IP "192.168.2.28" // 连接目标的 IP +#define WIFI_SPI_TARGET_IP "192.168.137.1" // 连接目标的 IP #define WIFI_SPI_TARGET_PORT "8080" // 连接目标的端口 -#define WIFI_SPI_LOCAL_PORT "8080" // 本机端口 +#define WIFI_SPI_LOCAL_PORT "6666" // 本机的端口 0:随机 可设置范围2048-65535 默认 6666 #endif -#define WIFI_SPI_MAX_MULTI (17) // 多地址发送,最大8个地址 -typedef enum -{ - BUFFER_IDLE, // 模块的缓冲区是空闲的 - BUFFER_READ, // 模块的缓冲区有数据需要读取 - BUFFER_WRITE, // 模块的缓冲区是可写的 -}wifi_spi_buffer_state_enum; +#define WIFI_SPI_RECVIVE_SIZE (32) // 每次SPI传输接收的字节数 不允许修改 +#define WIFI_SPI_TRANSFER_SIZE (4088) // 最大SPI传输接收的字节数 不允许修改 + + typedef enum -{ - TRANSMIT_IDLE, // 当前没有传输 - TRANSMIT_WRITE_REQUEST, // 给模块发送了一个传输请求 - TRANSMIT_READ_STATE, // 读取模块状态 - TRANSMIT_READ, // 正在读取模块内部数据 - TRANSMIT_WRITE, // 正在往模块写入数据 -}wifi_spi_transmit_state_enum; - -typedef enum -{ - WIFI_SPI_STATION, // 设备模式 - WIFI_SPI_SOFTAP, // AP模式 -}wifi_spi_mode_enum; - -typedef enum -{ - WIFI_SPI_COMMAND, // 使用命令的方式发送数据 - WIFI_SPI_SERIANET, // 使用透传的方式发送数据 -}wifi_spi_transfer_mode_enum; - -typedef enum -{ - WIFI_SPI_TCP_CLIENT, // 模块连接TCP服务器 - WIFI_SPI_TCP_SERVER, // 模块作为TCP服务器 - WIFI_SPI_UDP_CLIENT, // 模块启用UDP连接 -}wifi_spi_connect_mode_enum; - -typedef enum -{ - WIFI_SPI_SERVER_OFF, // 模块未连接服务器 - WIFI_SPI_SERVER_ON, // 模块已经连接服务器 -}wifi_spi_connect_state_enum; - -typedef enum -{ - WIFI_SPI_LINK_0, // 模块当前链接 0 - WIFI_SPI_LINK_1, // 模块当前链接 1 - WIFI_SPI_LINK_2, // 模块当前链接 2 - WIFI_SPI_LINK_3, // 模块当前链接 3 - WIFI_SPI_LINK_4, // 模块当前链接 4 -}wifi_spi_link_id_enum; - -typedef struct { - uint8 reserve; - uint8 cmd; - uint8 addr; - uint8 dummy; - uint8 magic; - uint8 sequence; - uint16 length; -}wifi_spi_buffer_struct; + // 主机发送的命令 + WIFI_SPI_INVALID1 = 0x00, // 无效数据包 + WIFI_SPI_RESET = 0x01, // 复位命令 + WIFI_SPI_DATA = 0x02, // 透传数据包 + WIFI_SPI_UDP_SEND = 0x03, // UDP下立即发送命令,默认SPI接收数据后2MS未收到数据自动发送数据 + WIFI_SPI_CLOSE_SOCKET = 0x04, // 断开连接 + + WIFI_SPI_SET_WIFI_INFORMATION = 0x10, // 设置WIFI信息命令 + WIFI_SPI_SET_SOCKET_INFORMATION = 0x11, // 设置SOCKET信息命令 + + WIFI_SPI_GET_VERSION = 0x20, // 获取模块版本 + WIFI_SPI_GET_MAC_ADDR = 0x21, // 获取模块MAC地址 + WIFI_SPI_GET_IP_ADDR = 0x22, // 获取模块IP地址 + + // 从机回传的命令 + WIFI_SPI_REPLY_OK = 0x80, // 从机应答的正确命令 + WIFI_SPI_REPLY_ERROR = 0x81, // 从机应答的错误命令 + + WIFI_SPI_REPLY_DATA_START = 0x90, // 从机回传的数据包,并且还有数据需要主机读取 + WIFI_SPI_REPLY_DATA_END = 0x91, // 从机回传的数据包,数据已读取完毕 + + WIFI_SPI_REPLY_VERSION = 0xA0, // 从机回复固件版本 + WIFI_SPI_REPLY_MAC_ADDR = 0xA1, // 从机回复本机MAC地址等信息 + WIFI_SPI_REPLY_IP_ADDR = 0xA2, // 从机回复本机IP地址、端口号 + WIFI_SPI_INVALID2 = 0xFF // 无效数据包 +}wifi_spi_packets_command_enum; + +typedef enum +{ + WIFI_SPI_IDLE, // 模块空闲,可以进行SPI通讯 + WIFI_SPI_BUSY, // 模块正忙,不可进行SPI通讯 +}wifi_spi_state_enum; + + +typedef struct +{ + uint8 command; // 命令字 + uint8 reserve; // 保留 + uint16 length; // 包有效长度 +}wifi_spi_head_struct; + + +typedef struct +{ + wifi_spi_head_struct head; // 帧头 + uint8 buffer[WIFI_SPI_RECVIVE_SIZE]; // 缓冲区 +}wifi_spi_packets_struct; + + +extern char wifi_spi_version[12]; // 固件版本 字符串 +extern char wifi_spi_mac_addr[20]; // 模块MAC地址 字符串 +extern char wifi_spi_ip_addr_port[25]; // IP地址与端口号 字符串 -typedef struct -{ - uint8 version[12]; // 固件版本 字符串形式 - uint8 mac[20]; // 本机 MAC 地址 字符串形式 - uint8 local_ip[17]; // 本机 IP 地址 字符串形式 - uint8 local_port[10]; // 本机端口号 字符串形式 - uint8 remote_ip[5][17]; // 远端 IP 地址 字符串形式 - wifi_spi_mode_enum mode; // WIFI 模式 - wifi_spi_transfer_mode_enum transfer_mode; // 当前传输模式 - wifi_spi_connect_mode_enum connect_mode; // 网络连接模式 - wifi_spi_connect_state_enum connect_state; // 服务器连接情况 -}wifi_spi_information_struct; +uint8 wifi_spi_wifi_connect (char *wifi_ssid, char *pass_word); +uint8 wifi_spi_socket_connect (char *transport_type, char *ip_addr, char *port, char *local_port); +uint8 wifi_spi_socket_disconnect (void); +uint8 wifi_spi_udp_send_now (void); +uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 length); +uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 length); -typedef struct -{ - uint8 *source[WIFI_SPI_MAX_MULTI]; - uint16 length[WIFI_SPI_MAX_MULTI]; -}wifi_spi_send_multi_struct; - -extern wifi_spi_information_struct wifi_spi_information; - - -uint8 wifi_spi_disconnected_wifi (void); // 断开 WIFI 连接 -uint8 wifi_spi_entry_serianet (void); // 打开透传模式 -uint8 wifi_spi_exit_serianet (void); // 关闭透传模式 - -uint8 wifi_spi_connect_tcp_servers (char *ip, char *port, wifi_spi_transfer_mode_enum mode); // 建立 TCP 连接 -uint8 wifi_spi_connect_udp_client (char *ip, char *port, char *local_port, wifi_spi_transfer_mode_enum mode); // 建立 UDP 传输 -uint8 wifi_spi_disconnect_link (void); // 断开连接 TCP Server 使用本接口将会断开所有连接 - -uint32 wifi_spi_send_byte (uint8 data); // WIFI 模块发送字节函数 -uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 length); // WIFI 模块发送缓冲区函数 -uint32 wifi_spi_send_buffer_multi (wifi_spi_send_multi_struct *multi_buffer); // WIFI 模块发送多缓冲区函数 -uint32 wifi_spi_send_string (const char *str); // WIFI 模块发送字符串函数 - -uint32 wifi_spi_read_buffer (uint8 *buff, uint32 len); // WIFI 模块数据接收函数 - -uint8 wifi_spi_init (char *wifi_ssid, char *pass_word, wifi_spi_mode_enum wifi_mode); // WIFI 模块初始化函数 +uint8 wifi_spi_init (char *wifi_ssid, char *pass_word); #endif + diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_wifi_uart.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_wifi_uart.c index 312dab7..ff728bb 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_wifi_uart.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_wifi_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_wifi_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -61,7 +61,7 @@ wifi_uart_information_struct wifi_uart_information; // 模块自身参数 -static fifo_obj_struct wifi_uart_fifo; +static fifo_struct wifi_uart_fifo; static uint8 wifi_uart_buffer[WIFI_UART_BUFFER_SIZE]; // 数据存放数组 static uint8 wifi_uart_data; diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_wifi_uart.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_wifi_uart.h index abcb253..3316b6f 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_wifi_uart.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_wifi_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_wifi_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_wireless_uart.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_wireless_uart.c index eac2867..91ec013 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_wireless_uart.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_wireless_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_wireless_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -53,7 +53,7 @@ #include "zf_device_type.h" #include "zf_device_wireless_uart.h" -static fifo_obj_struct wireless_uart_fifo; +static fifo_struct wireless_uart_fifo; static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; static uint8 wireless_uart_data = 0; diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_wireless_uart.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_wireless_uart.h index 2418545..a789ad0 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_wireless_uart.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_wireless_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_wireless_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -61,11 +61,11 @@ // 注意事项2:开启自动波特率务必连接RTS引脚 否则会开启失败。 // 注意事项3:模块自动波特率失败的话 可以尝试断电重启 -// 开启自动波特率务必阅读上面两条 注意事项 -// 开启自动波特率务必阅读上面两条 注意事项 -// 开启自动波特率务必阅读上面两条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 -// 0:关闭自动波特率 +// 0:关闭自动波特率 // 1:开启自动波特率 自动波特率的作用是修改 WIRELESS_UART_BAUD 之后不需要对模块进行配置 模块会自动设置为对应的波特率 #define WIRELESS_UART_AUTO_BAUD_RATE ( 1 ) diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_adc.c b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_adc.c index 9a262a1..06694d8 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_adc.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_adc.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_adc * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_adc.h b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_adc.h index 378b67e..f017c76 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_adc.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_adc.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_adc * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_delay.c b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_delay.c index 4ec533c..ae3e610 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_delay.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_delay.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_delay * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_delay.h b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_delay.h index e8d82ef..7b8b475 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_delay.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_delay.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_delay * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_dma.c b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_dma.c index f72f1d6..43bffbc 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_dma.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_dma.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_dma * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_dma.h b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_dma.h index 1ec555b..320d40c 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_dma.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_dma.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_dma * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_encoder.c b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_encoder.c index 6592198..0e0e0b9 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_encoder.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_encoder.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_encoder.h b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_encoder.h index 68d159f..e079122 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_encoder.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_encoder.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_exti.c b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_exti.c index 72c9a1f..31d270a 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_exti.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_exti.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_exti * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_exti.h b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_exti.h index 30f5ef6..b63f9ee 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_exti.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_exti.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_exti * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_flash.c b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_flash.c index f91f5a0..325cfed 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_flash.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_flash.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_flash * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_flash.h b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_flash.h index 912585a..e7425fd 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_flash.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_flash.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_flash * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_gpio.c b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_gpio.c index 5071114..a084353 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_gpio.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_gpio.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_gpio * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_gpio.h b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_gpio.h index 2b23be0..550fb8d 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_gpio.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_gpio.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_gpio * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_pit.c b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_pit.c index c4dc50d..5e03d38 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_pit.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_pit.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pit * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_pit.h b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_pit.h index 5461e05..66854b5 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_pit.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_pit.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pit * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_pwm.c b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_pwm.c index ad1059a..24d8d7a 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_pwm.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_pwm.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pwm * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_pwm.h b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_pwm.h index d6dce78..51948a4 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_pwm.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_pwm.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pwm * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_soft_iic.c b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_soft_iic.c index 9833b62..a349ec7 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_soft_iic.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_soft_iic.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_iic * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_soft_iic.h b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_soft_iic.h index a62b262..80db53b 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_soft_iic.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_soft_iic.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_iic * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_soft_spi.c b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_soft_spi.c index 292c60b..954fbe3 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_soft_spi.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_soft_spi.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_soft_spi.h b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_soft_spi.h index 6a9c207..62858de 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_soft_spi.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_soft_spi.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_spi.c b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_spi.c index 1b99196..f817dd9 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_spi.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_spi.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -920,7 +920,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 do { - IfxQspi_writeTransmitFifo(moudle, (uint8)(*write_buffer & 0xFF00) >> 8); // 将发送的数据写入缓冲区 + IfxQspi_writeTransmitFifo(moudle, (uint8)((*write_buffer & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 if(read_buffer != NULL) { diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_spi.h b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_spi.h index e73507e..d15589c 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_spi.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_spi.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_timer.c b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_timer.c index a953b92..e085d6e 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_timer.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_timer.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_timer * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_timer.h b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_timer.h index 3c86f58..1bb348f 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_timer.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_timer.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_timer * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_uart.c b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_uart.c index cd19782..fb89b55 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_uart.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_uart.h b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_uart.h index 8d1d111..cdc55ab 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_uart.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E10_printf_debug_log_demo/user/isr.c b/Example/E10_printf_debug_log_demo/user/isr.c index 27171d2..9108ff0 100644 --- a/Example/E10_printf_debug_log_demo/user/isr.c +++ b/Example/E10_printf_debug_log_demo/user/isr.c @@ -24,7 +24,7 @@ * 文件名称 isr * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -118,7 +118,7 @@ IFX_INTERRUPT(exti_ch1_ch5_isr, 0, EXTI_CH1_CH5_INT_PRIO) { exti_flag_clear(ERU_CH5_REQ1_P15_8); - wireless_module_spi_handler(); // SPI WIFI 中断回调函数 + } } diff --git a/Example/E11_interrupt_priority_set_demo/libraries/doc/version.txt b/Example/E11_interrupt_priority_set_demo/libraries/doc/version.txt index b841b50..d644136 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/doc/version.txt +++ b/Example/E11_interrupt_priority_set_demo/libraries/doc/version.txt @@ -1,3 +1,8 @@ +V3.2.6 + 更新逐飞助手接口函数 调用初始化时直接传参通信类 + 更新wifi SPI驱动文件 提高通信效率 + 更新GPS驱动文件,更名为GNSS,兼容普通定位模块及RTK + V3.2.5 修复延时函数初始化参数及中断向量表问题 V3.2.4 diff --git a/Example/E11_interrupt_priority_set_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h b/Example/E11_interrupt_priority_set_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h index 28ff689..371e6b6 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h @@ -34,7 +34,7 @@ /*------------------------------------------Configuration for IfxScu_cfg.h-------------------------------------------*/ /*********************************************************************************************************************/ /* External oscillator frequency in Hz */ -#define IFX_CFG_SCU_XTAL_FREQUENCY (20000000) /* Allowed values are: 16000000, 20000000 or 40000000 */ +#define IFX_CFG_SCU_XTAL_FREQUENCY (20000000) /* Allowed values are9p: 16000000, 20000000 or 40000000 */ /* PLL frequency in Hz */ #define IFX_CFG_SCU_PLL_FREQUENCY (200000000) /* Allowed values are: 80000000, 133000000, 160000000 * or 200000000 */ diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_clock.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_clock.c index 5023270..9872ea9 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_clock.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_clock.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_clock * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_clock.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_clock.h index 9face65..2b50396 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_clock.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_clock.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_clock * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_debug.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_debug.c index 52c623d..d680265 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_debug.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_debug.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_debug * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -46,7 +46,7 @@ static volatile uint8 zf_debug_assert_enable = 1; #if DEBUG_UART_USE_INTERRUPT // 如果启用 debug uart 接收中断 uint8 debug_uart_buffer[DEBUG_RING_BUFFER_LEN]; // 数据存放数组 uint8 debug_uart_data; -fifo_obj_struct debug_uart_fifo; +fifo_struct debug_uart_fifo; #endif //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_debug.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_debug.h index 881a297..4fb4d91 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_debug.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_debug.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_debug * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_fifo.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_fifo.c index b010d3e..94f5133 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_fifo.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_fifo.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_fifo * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -45,7 +45,7 @@ // 使用示例 fifo_head_offset(fifo, 1); // 备注信息 本函数在文件内部调用 用户不用关注 也不可修改 //------------------------------------------------------------------------------------------------------------------- -static void fifo_head_offset (fifo_obj_struct *fifo, uint32 offset) +static void fifo_head_offset (fifo_struct *fifo, uint32 offset) { fifo->head += offset; @@ -63,7 +63,7 @@ static void fifo_head_offset (fifo_obj_struct *fifo, uint32 offset) // 使用示例 fifo_end_offset(fifo, 1); // 备注信息 本函数在文件内部调用 用户不用关注 也不可修改 //------------------------------------------------------------------------------------------------------------------- -static void fifo_end_offset (fifo_obj_struct *fifo, uint32 offset) +static void fifo_end_offset (fifo_struct *fifo, uint32 offset) { fifo->end += offset; @@ -80,7 +80,7 @@ static void fifo_end_offset (fifo_obj_struct *fifo, uint32 offset) // 使用示例 fifo_clear(fifo); // 备注信息 清空当前 FIFO 对象的内存 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_clear (fifo_obj_struct *fifo) +fifo_state_enum fifo_clear (fifo_struct *fifo) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -113,7 +113,7 @@ fifo_state_enum fifo_clear (fifo_obj_struct *fifo) // 使用示例 uint32 len = fifo_used(fifo); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 fifo_used (fifo_obj_struct *fifo) +uint32 fifo_used (fifo_struct *fifo) { zf_assert(fifo != NULL); return (fifo->max - fifo->size); // 返回当前 FIFO 缓冲区中数据个数 @@ -127,7 +127,7 @@ uint32 fifo_used (fifo_obj_struct *fifo) // 使用示例 zf_log(fifo_write_element(&fifo, data) == FIFO_SUCCESS, "fifo_write_byte error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat) +fifo_state_enum fifo_write_element (fifo_struct *fifo, uint32 dat) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -171,7 +171,7 @@ fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat) // 使用示例 zf_log(fifo_write_buffer(&fifo, data, 32) == FIFO_SUCCESS, "fifo_write_buffer error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 length) +fifo_state_enum fifo_write_buffer (fifo_struct *fifo, void *dat, uint32 length) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -286,7 +286,7 @@ fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 leng // 使用示例 zf_log(fifo_read_element(&fifo, data, FIFO_READ_ONLY) == FIFO_SUCCESS, "fifo_read_byte error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operation_enum flag) +fifo_state_enum fifo_read_element (fifo_struct *fifo, void *dat, fifo_operation_enum flag) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -348,7 +348,7 @@ fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operat // 使用示例 zf_log(fifo_read_buffer(&fifo, data, &length, FIFO_READ_ONLY) == FIFO_SUCCESS, "fifo_read_buffer error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) +fifo_state_enum fifo_read_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) { zf_assert(NULL != fifo); zf_assert(NULL != length); @@ -447,7 +447,7 @@ fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *leng // 如果使用 FIFO_READ_AND_CLEAN 操作 将会丢弃所有数据并清空整个 FIFO // 如果使用 FIFO_READ_AND_CLEAN 操作 将会丢弃所有数据并清空整个 FIFO //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) +fifo_state_enum fifo_read_tail_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) { zf_assert(NULL != fifo); zf_assert(NULL != length); @@ -541,7 +541,7 @@ fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 // 使用示例 fifo_init(&user_fifo, user_buffer, 64); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_init (fifo_obj_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size) +fifo_state_enum fifo_init (fifo_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_fifo.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_fifo.h index 5cc7668..901a913 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_fifo.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_fifo.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_fifo * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -91,17 +91,17 @@ typedef struct uint32 end; // 缓存尾指针 总是指向非空缓存(缓存全空除外) uint32 size; // 缓存剩余大小 uint32 max; // 缓存总大小 -}fifo_obj_struct; +}fifo_struct; -fifo_state_enum fifo_clear (fifo_obj_struct *fifo); -uint32 fifo_used (fifo_obj_struct *fifo); +fifo_state_enum fifo_clear (fifo_struct *fifo); +uint32 fifo_used (fifo_struct *fifo); -fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat); -fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 length); -fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operation_enum flag); -fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); -fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); +fifo_state_enum fifo_write_element (fifo_struct *fifo, uint32 dat); +fifo_state_enum fifo_write_buffer (fifo_struct *fifo, void *dat, uint32 length); +fifo_state_enum fifo_read_element (fifo_struct *fifo, void *dat, fifo_operation_enum flag); +fifo_state_enum fifo_read_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); +fifo_state_enum fifo_read_tail_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); -fifo_state_enum fifo_init (fifo_obj_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size); +fifo_state_enum fifo_init (fifo_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size); #endif diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_font.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_font.c index c816f9d..ee1df09 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_font.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_font.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_font * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_font.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_font.h index 24b8602..7531250 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_font.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_font.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_font * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_function.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_function.c index d403fb5..acf2739 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_function.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_function.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_function * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_function.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_function.h index f5683e1..101b58a 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_function.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_function.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_function * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_headfile.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_headfile.h index aa06ef8..86762db 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_headfile.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_headfile.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_headfile * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -82,7 +82,7 @@ //===================================================外接设备驱动层=================================================== #include "zf_device_absolute_encoder.h" #include "zf_device_bluetooth_ch9141.h" -#include "zf_device_gps_tau1201.h" +#include "zf_device_gnss.h" #include "zf_device_camera.h" #include "zf_device_dl1a.h" #include "zf_device_dl1b.h" @@ -108,6 +108,7 @@ //====================================================应用组件层==================================================== #include "seekfree_assistant.h" +#include "seekfree_assistant_interface.h" //====================================================应用组件层==================================================== //=====================================================用户层====================================================== diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_interrupt.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_interrupt.c index 61058b2..af12fe0 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_interrupt.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_interrupt.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_interrupt * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_interrupt.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_interrupt.h index 99b0e53..f828423 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_interrupt.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_interrupt.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_interrupt * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_typedef.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_typedef.h index bd09f30..9a07c92 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_typedef.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_typedef.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_typedef * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_components/seekfree_assistant.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_components/seekfree_assistant.c index a196e10..0b7cb9d 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_components/seekfree_assistant.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_components/seekfree_assistant.c @@ -1,49 +1,71 @@ /********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ -#include "zf_common_fifo.h" + +#include "zf_common_debug.h" + #include "seekfree_assistant.h" -seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 -static seekfree_assistant_camera_struct seekfree_assistant_camera_data; // 图像上位机协议数据 -static seekfree_assistant_camera_dot_struct seekfree_assistant_camera_dot_data; // 图像上位机打点协议数据 -static seekfree_assistant_camera_buffer_struct seekfree_assistant_camera_buffer; // 图像以及边界缓冲区信息 -static fifo_obj_struct seekfree_assistant_fifo; -static uint8 seekfree_assistant_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE]; // 数据存放数组 -float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 保存接收到的参数 -vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 参数更新标志位 +extern uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length); +extern uint32 seekfree_assistant_receive (uint8 *buff, uint32 length); + +#if (1 == SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE) +#include "zf_common_fifo.h" +static uint8 seekfree_assistant_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE]; // FIFO缓冲区 +static fifo_struct seekfree_assistant_fifo = // FIFO结构体 +{ + .buffer = seekfree_assistant_buffer, + .execution = FIFO_IDLE, + .type = FIFO_DATA_8BIT, + .head = 0, + .end = 0, + .size = SEEKFREE_ASSISTANT_BUFFER_SIZE, + .max = SEEKFREE_ASSISTANT_BUFFER_SIZE, +}; +#endif + +static seekfree_assistant_camera_struct seekfree_assistant_camera_data; // 图像上位机协议数据 +static seekfree_assistant_camera_dot_struct seekfree_assistant_camera_dot_data; // 图像上位机打点协议数据 +static seekfree_assistant_camera_buffer_struct seekfree_assistant_camera_buffer; // 图像以及边界缓冲区信息 + +seekfree_assistant_transfer_callback_function seekfree_assistant_transfer_callback = seekfree_assistant_transfer; // 数据发送函数指针 +seekfree_assistant_receive_callback_function seekfree_assistant_receive_callback = seekfree_assistant_receive; // 数据接收函数指针 + +seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 +float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 保存接收到的参数 +vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 参数更新标志位 //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手求和函数 @@ -87,7 +109,7 @@ void seekfree_assistant_camera_data_send (seekfree_assistant_image_type_enum cam seekfree_assistant_camera_data.image_height = height; // 首先发送帧头、功能、摄像头类型、以及宽度高度等信息 - seekfree_assistant_transfer((const uint8 *)&seekfree_assistant_camera_data, sizeof(seekfree_assistant_camera_struct)); + seekfree_assistant_transfer_callback((const uint8 *)&seekfree_assistant_camera_data, sizeof(seekfree_assistant_camera_struct)); // 根据摄像头类型计算图像大小 switch(camera_type) @@ -111,9 +133,8 @@ void seekfree_assistant_camera_data_send (seekfree_assistant_image_type_enum cam // 发送图像数据 if(NULL != image_addr) { - seekfree_assistant_transfer(image_addr, image_size); + seekfree_assistant_transfer_callback(image_addr, image_size); } - } //------------------------------------------------------------------------------------------------------------------- @@ -139,16 +160,15 @@ void seekfree_assistant_camera_dot_send (seekfree_assistant_camera_buffer_struct dot_bytes *= 2; } - // 首先发送帧头、功能、边界编号、坐标长度、点个数 - seekfree_assistant_transfer((const uint8 *)&seekfree_assistant_camera_dot_data, sizeof(seekfree_assistant_camera_dot_struct)); + seekfree_assistant_transfer_callback((const uint8 *)&seekfree_assistant_camera_dot_data, sizeof(seekfree_assistant_camera_dot_struct)); for(i=0; i < SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY; i++) { // 判断是否发送横坐标数据 if(NULL != buffer->boundary_x[i]) { - seekfree_assistant_transfer((const uint8 *)buffer->boundary_x[i], dot_bytes); + seekfree_assistant_transfer_callback((const uint8 *)buffer->boundary_x[i], dot_bytes); } // 判断是否发送纵坐标数据 @@ -156,10 +176,9 @@ void seekfree_assistant_camera_dot_send (seekfree_assistant_camera_buffer_struct { // 如果没有纵坐标数据,则表示每一行只有一个边界 // 指定了横纵坐标数据,这种方式可以实现同一行多个边界的情况,例如搜线算法能够搜索出回弯。 - seekfree_assistant_transfer((const uint8 *)buffer->boundary_y[i], dot_bytes); + seekfree_assistant_transfer_callback((const uint8 *)buffer->boundary_y[i], dot_bytes); } } - } //------------------------------------------------------------------------------------------------------------------- @@ -193,7 +212,7 @@ void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struc // 数据在调用本函数之前,由用户将需要发送的数据写入seekfree_assistant_oscilloscope_data.data[] - seekfree_assistant_transfer((const uint8 *)seekfree_assistant_oscilloscope, packet_size); + seekfree_assistant_transfer_callback((const uint8 *)seekfree_assistant_oscilloscope, packet_size); } //------------------------------------------------------------------------------------------------------------------- @@ -364,12 +383,14 @@ void seekfree_assistant_camera_send (void) } } + //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手解析接收到的数据 // 参数说明 void // 返回参数 void // 使用示例 函数只需要放到周期运行的PIT中断或者主循环即可 //------------------------------------------------------------------------------------------------------------------- +#if (1 == SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE) void seekfree_assistant_data_analysis (void) { uint8 temp_sum; @@ -380,14 +401,13 @@ void seekfree_assistant_data_analysis (void) uint32 temp_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE / 4]; // 尝试读取数据, 如果不是自定义的传输方式则从接收回调中读取数据 - read_length = seekfree_assistant_receive((uint8 *)temp_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); + read_length = seekfree_assistant_receive_callback((uint8 *)temp_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); if(read_length) { // 将读取到的数据写入FIFO fifo_write_buffer(&seekfree_assistant_fifo, (uint8 *)temp_buffer, read_length); } - while(sizeof(seekfree_assistant_parameter_struct) <= fifo_used(&seekfree_assistant_fifo)) { read_length = sizeof(seekfree_assistant_parameter_struct); @@ -416,21 +436,11 @@ void seekfree_assistant_data_analysis (void) } } - // 丢弃无需使用的数据 fifo_read_buffer(&seekfree_assistant_fifo, (uint8 *)temp_buffer, &read_length, FIFO_READ_AND_CLEAN); } } - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 逐飞助手 初始化 -// 参数说明 -// 返回参数 void -// 使用示例 -//------------------------------------------------------------------------------------------------------------------- -ZF_WEAK void seekfree_assistant_init () -{ - fifo_init(&seekfree_assistant_fifo, FIFO_DATA_8BIT, seekfree_assistant_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); -} +#endif + diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_components/seekfree_assistant.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_components/seekfree_assistant.h index d02abb1..ae0f67c 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_components/seekfree_assistant.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_components/seekfree_assistant.h @@ -1,69 +1,75 @@ -/*/********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +/********************************************************************************************************************* +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ #ifndef _seekfree_assistant_h_ #define _seekfree_assistant_h_ #include "zf_common_typedef.h" -#include "zf_common_debug.h" + + +// 1:使能参数调节的功能 0:关闭参数调节的功能 +#define SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE ( 1 ) + + // 定义接收FIFO大小 -#define SEEKFREE_ASSISTANT_BUFFER_SIZE ( 0x80 ) +#define SEEKFREE_ASSISTANT_BUFFER_SIZE ( 0x80 ) + +// 定义示波器的最大通道数量 +#define SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT ( 0x08 ) + +// 定义参数调试的最大通道数量 +#define SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT ( 0x08 ) + +// 定义图像边线最大数量 +#define SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY ( 0x08 ) + +// 单片机往上位机发送的帧头 +#define SEEKFREE_ASSISTANT_SEND_HEAD ( 0xAA ) + +// 摄像头类 +#define SEEKFREE_ASSISTANT_CAMERA_FUNCTION ( 0x02 ) +#define SEEKFREE_ASSISTANT_CAMERA_DOT_FUNCTION ( 0x03 ) +#define SEEKFREE_ASSISTANT_CAMERA_OSCILLOSCOPE ( 0x10 ) + +// 上位机往单片机发送的帧头 +#define SEEKFREE_ASSISTANT_RECEIVE_HEAD ( 0x55 ) + +// 参数设置类 +#define SEEKFREE_ASSISTANT_RECEIVE_SET_PARAMETER ( 0x20 ) -// 定义示波器的最大通道数量 -#define SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT ( 0x08 ) - -// 定义参数调试的最大通道数量 -#define SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT ( 0x08 ) - -// 定义图像边线最大数量 -#define SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY ( 0x08 ) - -// 单片机往上位机发送的帧头 -#define SEEKFREE_ASSISTANT_SEND_HEAD ( 0xAA ) - -// 摄像头类 -#define SEEKFREE_ASSISTANT_CAMERA_FUNCTION ( 0x02 ) -#define SEEKFREE_ASSISTANT_CAMERA_DOT_FUNCTION ( 0x03 ) -#define SEEKFREE_ASSISTANT_CAMERA_OSCILLOSCOPE ( 0x10 ) - -// 上位机往单片机发送的帧头 -#define SEEKFREE_ASSISTANT_RECEIVE_HEAD ( 0x55 ) - -// 参数设置类 -#define SEEKFREE_ASSISTANT_RECEIVE_SET_PARAMETER ( 0x20 ) // 摄像头类型枚举 typedef enum @@ -91,71 +97,69 @@ typedef enum typedef struct { - uint8 head; // 帧头 - uint8 channel_num; // 高四位为功能字 低四位为通道数量 - uint8 check_sum; // 和校验 - uint8 length; // 包长度 - float data[SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT]; // 通道数据 + uint8 head; // 帧头 + uint8 channel_num; // 高四位为功能字 低四位为通道数量 + uint8 check_sum; // 和校验 + uint8 length; // 包长度 + float data[SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT]; // 通道数据 }seekfree_assistant_oscilloscope_struct; typedef struct { - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 camera_type; // 低四位表示边界数量 第四位表示是否有图像数据 例如0x13:其中3表示一副图像有三条边界(通常是左边界、中线、右边界)、1表示没有图像数据 - uint8 length; // 包长度(仅包含协议部分) - uint16 image_width; // 图像宽度 - uint16 image_height; // 图像高度 -}seekfree_assistant_camera_struct; - - -typedef struct -{ - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 dot_type; // 点类型 BIT5:1:坐标是16位的 0:坐标是8位的 BIT7-BIT6:0:只有X坐标 1:只有Y坐标 2:X和Y坐标都有 BIT3-BIT0:边界数量 - uint8 length; // 包长度(仅包含协议部分) - uint16 dot_num; // 画点数量 - uint8 valid_flag; // 通道标识 - uint8 reserve; // 保留 -}seekfree_assistant_camera_dot_struct; - -typedef struct -{ - void *image_addr; // 摄像头地址 - uint16 width; // 图像宽度 - uint16 height; // 图像高度 - seekfree_assistant_image_type_enum camera_type; // 摄像头类型 - void *boundary_x[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界横坐标数组地址 - void *boundary_y[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界纵坐标数组地址 + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 camera_type; // 低四位表示边界数量 第四位表示是否有图像数据 例如0x13:其中3表示一副图像有三条边界(通常是左边界、中线、右边界)、1表示没有图像数据 + uint8 length; // 包长度(仅包含协议部分) + uint16 image_width; // 图像宽度 + uint16 image_height; // 图像高度 +}seekfree_assistant_camera_struct; + + +typedef struct +{ + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 dot_type; // 点类型 BIT5:1:坐标是16位的 0:坐标是8位的 BIT7-BIT6:0:只有X坐标 1:只有Y坐标 2:X和Y坐标都有 BIT3-BIT0:边界数量 + uint8 length; // 包长度(仅包含协议部分) + uint16 dot_num; // 画点数量 + uint8 valid_flag; // 通道标识 + uint8 reserve; // 保留 +}seekfree_assistant_camera_dot_struct; + +typedef struct +{ + void *image_addr; // 摄像头地址 + uint16 width; // 图像宽度 + uint16 height; // 图像高度 + seekfree_assistant_image_type_enum camera_type; // 摄像头类型 + void *boundary_x[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界横坐标数组地址 + void *boundary_y[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界纵坐标数组地址 }seekfree_assistant_camera_buffer_struct; typedef struct { - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 channel; // 通道 - uint8 check_sum; // 和校验 - float data; // 数据 + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 channel; // 通道 + uint8 check_sum; // 和校验 + float data; // 数据 }seekfree_assistant_parameter_struct; +typedef uint32 (*seekfree_assistant_transfer_callback_function) (const uint8 *buff, uint32 length); +typedef uint32 (*seekfree_assistant_receive_callback_function) (uint8 *buff, uint32 length); -extern seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 -extern float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 保存接收到的参数 -extern vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 参数更新标志位 +extern seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 +extern float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 保存接收到的参数 +extern vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 参数更新标志位 + + +void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struct *seekfree_assistant_oscilloscope); +void seekfree_assistant_camera_information_config (seekfree_assistant_image_type_enum camera_type, void *image_addr, uint16 width, uint16 height); +void seekfree_assistant_camera_boundary_config (seekfree_assistant_boundary_type_enum boundary_type, uint16 dot_num, void *dot_x1, void *dot_x2, void *dot_x3, void *dot_y1, void *dot_y2, void *dot_y3); +void seekfree_assistant_camera_send (void); +void seekfree_assistant_data_analysis (void); -uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length); -uint32 seekfree_assistant_receive (uint8 *buff, uint32 length); - -void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struct *seekfree_assistant_oscilloscope); - -void seekfree_assistant_camera_information_config (seekfree_assistant_image_type_enum camera_type, void *image_addr, uint16 width, uint16 height); -void seekfree_assistant_camera_boundary_config (seekfree_assistant_boundary_type_enum boundary_type, uint16 dot_num, void *dot_x1, void *dot_x2, void *dot_x3, void *dot_y1, void *dot_y2, void *dot_y3); -void seekfree_assistant_camera_send (void); - -void seekfree_assistant_data_analysis (void); -void seekfree_assistant_init (void); #endif diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_components/seekfree_assistant_interface.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_components/seekfree_assistant_interface.c index 99dbeef..fdade63 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_components/seekfree_assistant_interface.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_components/seekfree_assistant_interface.c @@ -1,42 +1,55 @@ /********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant_interface * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ #include "zf_common_typedef.h" +#include "zf_common_fifo.h" #include "zf_common_debug.h" +#include "zf_driver_uart.h" +#include "zf_device_wireless_uart.h" +#include "zf_device_bluetooth_ch9141.h" +#include "zf_device_wifi_uart.h" +#include "zf_device_wifi_spi.h" #include "seekfree_assistant.h" +#include "seekfree_assistant_interface.h" + + +extern seekfree_assistant_transfer_callback_function seekfree_assistant_transfer_callback; // 数据发送函数指针 +extern seekfree_assistant_receive_callback_function seekfree_assistant_receive_callback; // 数据接收函数指针 + + //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手发送函数 // 参数说明 *buff 需要发送的数据地址 @@ -46,11 +59,9 @@ //------------------------------------------------------------------------------------------------------------------- ZF_WEAK uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length) { - uint32 len = 0; - - len = debug_send_buffer(buff, length); - - return len; + + // 当选择自定义通讯方式时 需要自行完成数据发送功能 + return length; } //------------------------------------------------------------------------------------------------------------------- @@ -62,11 +73,57 @@ ZF_WEAK uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length) //------------------------------------------------------------------------------------------------------------------- ZF_WEAK uint32 seekfree_assistant_receive (uint8 *buff, uint32 length) { - uint32 len = 0; + // 当选择自定义通讯方式时 需要自行完成数据接收功能 + return 0; +} - len = debug_read_ring_buffer(buff, length); - - return len; +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 逐飞助手接口 初始化 +// 参数说明 +// 返回参数 void +// 使用示例 seekfree_assistant_interface_init(SEEKFREE_ASSISTANT_WIFI_SPI); 使用高速WIFI SPI模块进行数据收发 +// 备注 需要自行调用设备的初始化,例如使用无线转串口进行数据的收发,则需要自行调用无线转串口的初始化,然后再调用seekfree_assistant_interface_init完成逐飞助手的接口初始化 +//------------------------------------------------------------------------------------------------------------------- +ZF_WEAK void seekfree_assistant_interface_init (seekfree_assistant_transfer_device_enum transfer_device) +{ + switch(transfer_device) + { + case SEEKFREE_ASSISTANT_DEBUG_UART: + { + seekfree_assistant_transfer_callback = debug_send_buffer; + seekfree_assistant_receive_callback = debug_read_ring_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIRELESS_UART: + { + seekfree_assistant_transfer_callback = wireless_uart_send_buffer; + seekfree_assistant_receive_callback = wireless_uart_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_CH9141: + { + seekfree_assistant_transfer_callback = bluetooth_ch9141_send_buffer; + seekfree_assistant_receive_callback = bluetooth_ch9141_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIFI_UART: + { + seekfree_assistant_transfer_callback = wifi_uart_send_buffer; + seekfree_assistant_receive_callback = wifi_uart_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIFI_SPI: + { + seekfree_assistant_transfer_callback = wifi_spi_send_buffer; + seekfree_assistant_receive_callback = wifi_spi_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_CUSTOM: + { + // 根据自己的需求 自行实现seekfree_assistant_transfer与seekfree_assistant_receive函数,完成数据的收发 + + }break; + } } diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_components/seekfree_assistant_interface.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_components/seekfree_assistant_interface.h new file mode 100644 index 0000000..940b5f7 --- /dev/null +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_components/seekfree_assistant_interface.h @@ -0,0 +1,57 @@ +/********************************************************************************************************************* +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 +* Copyright (c) 2022 SEEKFREE 逐飞科技 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 +* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 +* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 +* +* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 +* 甚至没有隐含的适销性或适合特定用途的保证 +* 更多细节请参见 GPL +* +* 您应该在收到本开源库的同时收到一份 GPL 的副本 +* 如果没有,请参阅 +* +* 额外注明: +* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 +* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 +* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 +* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) +* +* 文件名称 seekfree_assistant_interface +* 公司名称 成都逐飞科技有限公司 +* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A +* 店铺链接 https://seekfree.taobao.com/ +* +* 修改记录 +* 日期 作者 备注 +* 2024-1-11 SeekFree first version +********************************************************************************************************************/ + +#ifndef _seekfree_assistant_interface_h_ +#define _seekfree_assistant_interface_h_ + + + +// 数据发送设备枚举 +typedef enum +{ + SEEKFREE_ASSISTANT_DEBUG_UART, // 调试串口 使用的串口由DEBUG_UART_INDEX宏定义指定 + SEEKFREE_ASSISTANT_WIRELESS_UART, // 无线转串口 + SEEKFREE_ASSISTANT_CH9141, // CH9141蓝牙 + SEEKFREE_ASSISTANT_WIFI_UART, // WIFI转串口 + SEEKFREE_ASSISTANT_WIFI_SPI, // 高速WIFI SPI + SEEKFREE_ASSISTANT_CUSTOM, // 自定义通讯方式 需要自行seekfree_assistant_transfer与seekfree_assistant_receive函数 +}seekfree_assistant_transfer_device_enum; + + +void seekfree_assistant_interface_init (seekfree_assistant_transfer_device_enum transfer_device); + + + +#endif diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_absolute_encoder.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_absolute_encoder.c index 7c80a3b..f9bc809 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_absolute_encoder.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_absolute_encoder.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_absolute_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_absolute_encoder.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_absolute_encoder.h index e6cc057..ed92906 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_absolute_encoder.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_absolute_encoder.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_absolute_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c index 500bccb..b0a06df 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_bluetooth_ch9141 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -54,7 +54,7 @@ #include "zf_device_camera.h" #include "zf_device_bluetooth_ch9141.h" -static fifo_obj_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 +static fifo_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 static uint8 bluetooth_ch9141_buffer[BLUETOOTH_CH9141_BUFFER_SIZE]; // 数据存放数组 static uint8 bluetooth_ch9141_data = 0; // 数据临时存放变量 diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h index 800be6c..ffb30b5 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h @@ -24,7 +24,7 @@ * 文件名称 main * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_camera.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_camera.c index 84c7aa0..68668c4 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_camera.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_camera.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_camera * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -45,7 +45,7 @@ #include "zf_device_camera.h" -fifo_obj_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 +fifo_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; // 定义摄像头接收数据缓冲区 uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // 定义摄像头数据发送到上位机的帧头 diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_camera.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_camera.h index 58efb06..2cd7d2d 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_camera.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_camera.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_camera * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -44,7 +44,7 @@ //=================================================摄像头公共库 基本配置================================================ #define CAMERA_RECEIVER_BUFFER_SIZE (8) // 定义摄像头接收数据缓冲区大小 -extern fifo_obj_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 +extern fifo_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 extern uint8 camera_send_image_frame_header[4]; // 声明摄像头数据发送到上位机的帧头 //=================================================摄像头公共库 基本配置================================================ diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_config.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_config.h index af6a3d8..6c8147d 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_config.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_config.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_config * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_dl1a.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_dl1a.c index 3e7410c..27be3a7 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_dl1a.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_dl1a.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1a * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_dl1a.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_dl1a.h index 89145d3..3176dd3 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_dl1a.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_dl1a.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1a * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_dl1b.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_dl1b.c index 90e64b3..96e472e 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_dl1b.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_dl1b.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1b * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_dl1b.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_dl1b.h index b144739..922b3ce 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_dl1b.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_dl1b.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1b * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_gnss.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_gnss.c new file mode 100644 index 0000000..caf7cd0 --- /dev/null +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_gnss.c @@ -0,0 +1,620 @@ +/********************************************************************************************************************* +* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* Copyright (c) 2022 SEEKFREE 逐飞科技 +* +* 本文件是 TC264 开源库的一部分 +* +* TC264 开源库 是免费软件 +* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 +* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 +* +* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 +* 甚至没有隐含的适销性或适合特定用途的保证 +* 更多细节请参见 GPL +* +* 您应该在收到本开源库的同时收到一份 GPL 的副本 +* 如果没有,请参阅 +* +* 额外注明: +* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 +* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 +* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 +* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) +* +* 文件名称 zf_device_gnss +* 公司名称 成都逐飞科技有限公司 +* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 +* 开发环境 ADS v1.9.20 +* 适用平台 TC264D +* 店铺链接 https://seekfree.taobao.com/ +* +* 修改记录 +* 日期 作者 备注 +* 2023-12-28 pudding first version +********************************************************************************************************************/ +/********************************************************************************************************************* +* 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* RX 查看 zf_device_gnss.h 中 GNSS_RX 宏定义 +* TX 查看 zf_device_gnss.h 中 GNSS_TX 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* ------------------------------------ +********************************************************************************************************************/ + +#include "math.h" +#include "zf_common_function.h" +#include "zf_common_fifo.h" +#include "zf_driver_delay.h" +#include "zf_driver_uart.h" + +#include "zf_device_gnss.h" + +#define GNSS_BUFFER_SIZE ( 128 ) + +uint8 gnss_flag = 0; // 1:采集完成等待处理数据 0:没有采集完成 +gnss_info_struct gnss; // GPS解析之后的数据 + +static uint8 gnss_state = 0; // 1:GPS初始化完成 +static fifo_struct gnss_receiver_fifo; // +static uint8 gnss_receiver_buffer[GNSS_BUFFER_SIZE]; // 数据存放数组 + +static gps_state_enum gnss_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 +static gps_state_enum gnss_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 +static gps_state_enum gnss_ths_state = GPS_STATE_RECEIVING; // rmc 语句状态 + +static uint8 gps_gga_buffer[GNSS_BUFFER_SIZE]; +static uint8 gps_rmc_buffer[GNSS_BUFFER_SIZE]; +static uint8 gps_ths_buffer[GNSS_BUFFER_SIZE]; + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 获取指定 ',' 后面的索引 +// 参数说明 num 第几个逗号 +// 参数说明 *str 字符串 +// 返回参数 uint8 返回索引 +// 使用示例 get_parameter_index(1, s); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 get_parameter_index (uint8 num, char *str) +{ + uint8 i = 0, j = 0; + char *temp = strchr(str, '\n'); + uint8 len = 0, len1 = 0; + + 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; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 给定字符串第一个 ',' 之前的数据转换为int +// 参数说明 *s 字符串 +// 返回参数 float 返回数值 +// 使用示例 get_int_number(&buf[get_parameter_index(7, buf)]); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static int get_int_number (char *s) +{ + char buf[10]; + uint8 i = 0; + int return_value = 0; + i = get_parameter_index(1, s); + i = i - 1; + strncpy(buf, s, i); + buf[i] = 0; + return_value = func_str_to_int(buf); + return return_value; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 给定字符串第一个 ',' 之前的数据转换为float +// 参数说明 *s 字符串 +// 返回参数 float 返回数值 +// 使用示例 get_float_number(&buf[get_parameter_index(8, buf)]); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static float get_float_number (char *s) +{ + uint8 i = 0; + char buf[15]; + float return_value = 0; + + i = get_parameter_index(1, s); + i = i - 1; + strncpy(buf, s, i); + buf[i] = 0; + return_value = (float)func_str_to_double(buf); + return return_value; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 给定字符串第一个 ',' 之前的数据转换为double +// 参数说明 *s 字符串 +// 返回参数 double 返回数值 +// 使用示例 get_double_number(&buf[get_parameter_index(3, buf)]); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static double get_double_number (char *s) +{ + uint8 i = 0; + char buf[15]; + double return_value = 0; + + i = get_parameter_index(1, s); + i = i - 1; + strncpy(buf, s, i); + buf[i] = 0; + return_value = func_str_to_double(buf); + return return_value; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 世界时间转换为北京时间 +// 参数说明 *time 保存的时间 +// 返回参数 void +// 使用示例 utc_to_btc(&gnss->time); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static void utc_to_btc (gps_time_struct *time) +{ + uint8 day_num = 0; + + time->hour = time->hour + 8; + if(23 < time->hour) + { + time->hour -= 24; + time->day += 1; + + if(2 == time->month) + { + day_num = 28; + if((0 == time->year % 4 && 0 != time->year % 100) || 0 == time->year % 400) // 判断是否为闰年 + { + day_num ++; // 闰月 2月为29天 + } + } + else + { + day_num = 31; // 1 3 5 7 8 10 12这些月份为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(12 < time->month) + { + time->month -= 12; + time->year ++; + } + } + } +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 RMC语句解析 +// 参数说明 *line 接收到的语句信息 +// 参数说明 *gnss 保存解析后的数据 +// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 +// 使用示例 gps_gnrmc_parse((char *)data_buffer, &gnss); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 gps_gnrmc_parse (char *line, gnss_info_struct *gnss) +{ + uint8 state = 0, temp = 0; + + double latitude = 0; // 纬度 + double longitude = 0; // 经度 + + double lati_cent_tmp = 0, lati_second_tmp = 0; + double long_cent_tmp = 0, long_second_tmp = 0; + float speed_tmp = 0; + char *buf = line; + uint8 return_state = 0; + + state = buf[get_parameter_index(2, buf)]; + + if('A' == state) // 如果数据有效 则解析数据 + { + return_state = 1; + gnss->state = 1; + gnss -> ns = buf[get_parameter_index(4, buf)]; + gnss -> 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)]); + + gnss->latitude_degree = (int)latitude / 100; // 纬度转换为度分秒 + lati_cent_tmp = (latitude - gnss->latitude_degree * 100); + gnss->latitude_cent = (int)lati_cent_tmp; + lati_second_tmp = (lati_cent_tmp - gnss->latitude_cent) * 6000; + gnss->latitude_second = (int)lati_second_tmp; + + gnss->longitude_degree = (int)longitude / 100; // 经度转换为度分秒 + long_cent_tmp = (longitude - gnss->longitude_degree * 100); + gnss->longitude_cent = (int)long_cent_tmp; + long_second_tmp = (long_cent_tmp - gnss->longitude_cent) * 6000; + gnss->longitude_second = (int)long_second_tmp; + + gnss->latitude = gnss->latitude_degree + lati_cent_tmp / 60; + gnss->longitude = gnss->longitude_degree + long_cent_tmp / 60; + + speed_tmp = get_float_number(&buf[get_parameter_index(7, buf)]); // 速度(海里/小时) + gnss->speed = speed_tmp * 1.85f; // 转换为公里/小时 + gnss->direction = get_float_number(&buf[get_parameter_index(8, buf)]); // 角度 + } + else + { + gnss->state = 0; + } + + // 在定位没有生效前也是有时间数据的,可以直接解析 + gnss->time.hour = (buf[7] - '0') * 10 + (buf[8] - '0'); // 时间 + gnss->time.minute = (buf[9] - '0') * 10 + (buf[10] - '0'); + gnss->time.second = (buf[11] - '0') * 10 + (buf[12] - '0'); + temp = get_parameter_index(9, buf); + gnss->time.day = (buf[temp + 0] - '0') * 10 + (buf[temp + 1] - '0'); // 日期 + gnss->time.month = (buf[temp + 2] - '0') * 10 + (buf[temp + 3] - '0'); + gnss->time.year = (buf[temp + 4] - '0') * 10 + (buf[temp + 5] - '0') + 2000; + + utc_to_btc(&gnss->time); + + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 GGA语句解析 +// 参数说明 *line 接收到的语句信息 +// 参数说明 *gnss 保存解析后的数据 +// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 +// 使用示例 gps_gngga_parse((char *)data_buffer, &gnss); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 gps_gngga_parse (char *line, gnss_info_struct *gnss) +{ + uint8 state = 0; + char *buf = line; + uint8 return_state = 0; + + state = buf[get_parameter_index(2, buf)]; + + if(',' != state) + { + gnss->satellite_used = (uint8)get_int_number(&buf[get_parameter_index(7, buf)]); + gnss->height = get_float_number(&buf[get_parameter_index(9, buf)]) + get_float_number(&buf[get_parameter_index(11, buf)]); // 高度 = 海拔高度 + 地球椭球面相对大地水准面的高度 + return_state = 1; + } + + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 THS语句解析 +// 参数说明 *line 接收到的语句信息 +// 参数说明 *gnss 保存解析后的数据 +// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 +// 使用示例 gps_gnths_parse((char *)data_buffer, &gnss); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 gps_gnths_parse (char *line, gnss_info_struct *gnss) +{ + uint8 state = 0; + char *buf = line; + uint8 return_state = 0; + + state = buf[get_parameter_index(2, buf)]; + + if('A' == state) + { + gnss->antenna_direction_state = 1; + gnss->antenna_direction = get_float_number(&buf[get_parameter_index(1, buf)]); + return_state = 1; + } + else + { + gnss->antenna_direction_state = 0; + } + + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 计算从第一个点到第二个点的距离 +// 参数说明 latitude1 第一个点的纬度 +// 参数说明 longitude1 第一个点的经度 +// 参数说明 latitude2 第二个点的纬度 +// 参数说明 longitude2 第二个点的经度 +// 返回参数 double 返回两点距离 +// 使用示例 get_two_points_distance(latitude1_1, longitude1, latitude2, longitude2); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +double get_two_points_distance (double latitude1, double longitude1, double latitude2, double longitude2) +{ + const double EARTH_RADIUS = 6378137; // 地球半径(单位:m) + double rad_latitude1 = 0; + double rad_latitude2 = 0; + double rad_longitude1 = 0; + double rad_longitude2 = 0; + double distance = 0; + double a = 0; + double b = 0; + + rad_latitude1 = ANGLE_TO_RAD(latitude1); // 根据角度计算弧度 + 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 里面实现的算法 + distance = distance * EARTH_RADIUS; + + return distance; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 计算从第一个点到第二个点的方位角 +// 参数说明 latitude1 第一个点的纬度 +// 参数说明 longitude1 第一个点的经度 +// 参数说明 latitude2 第二个点的纬度 +// 参数说明 longitude2 第二个点的经度 +// 返回参数 double 返回方位角(0至360) +// 使用示例 get_two_points_azimuth(latitude1_1, longitude1, latitude2, longitude2); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +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 ((0 < angle) ? angle : (angle + 360)); +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 解析GPS数据 +// 参数说明 void +// 返回参数 uint8 0-解析成功 1-解析失败 可能数据包错误 +// 使用示例 gps_data_parse(); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +uint8 gnss_data_parse (void) +{ + uint8 return_state = 0; + uint8 check_buffer[5] = {'0', 'x', 0x00, 0x00, 0x00}; + uint8 bbc_xor_origin = 0; + uint8 bbc_xor_calculation = 0; + uint32 data_len = 0; + + do + { + if(GPS_STATE_RECEIVED == gnss_rmc_state) + { + gnss_rmc_state = GPS_STATE_PARSING; + strncpy((char *)&check_buffer[2], strchr((const char *)gps_rmc_buffer, '*') + 1, 2); + bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); + for(bbc_xor_calculation = gps_rmc_buffer[1], data_len = 2; '*' != gps_rmc_buffer[data_len]; data_len ++) + { + bbc_xor_calculation ^= gps_rmc_buffer[data_len]; + } + if(bbc_xor_calculation != bbc_xor_origin) + { + // 数据校验失败 + return_state = 1; + break; + } + + gps_gnrmc_parse((char *)gps_rmc_buffer, &gnss); + } + gnss_rmc_state = GPS_STATE_RECEIVING; + + if(GPS_STATE_RECEIVED == gnss_gga_state) + { + gnss_gga_state = GPS_STATE_PARSING; + strncpy((char *)&check_buffer[2], strchr((const char *)gps_gga_buffer, '*') + 1, 2); + bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); + + for(bbc_xor_calculation = gps_gga_buffer[1], data_len = 2; '*' != gps_gga_buffer[data_len]; data_len ++) + { + bbc_xor_calculation ^= gps_gga_buffer[data_len]; + } + if(bbc_xor_calculation != bbc_xor_origin) + { + // 数据校验失败 + return_state = 1; + break; + } + + gps_gngga_parse((char *)gps_gga_buffer, &gnss); + } + gnss_gga_state = GPS_STATE_RECEIVING; + + if(GPS_STATE_RECEIVED == gnss_ths_state) + { + gnss_ths_state = GPS_STATE_PARSING; + strncpy((char *)&check_buffer[2], strchr((const char *)gps_ths_buffer, '*') + 1, 2); + bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); + + for(bbc_xor_calculation = gps_ths_buffer[1], data_len = 2; '*' != gps_ths_buffer[data_len]; data_len ++) + { + bbc_xor_calculation ^= gps_ths_buffer[data_len]; + } + if(bbc_xor_calculation != bbc_xor_origin) + { + // 数据校验失败 + return_state = 1; + break; + } + + gps_gnths_parse((char *)gps_ths_buffer, &gnss); + } + gnss_ths_state = GPS_STATE_RECEIVING; + + }while(0); + return return_state; +} + + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 GPS串口回调函数 +// 参数说明 void +// 返回参数 void +// 使用示例 gps_uart_callback(); +// 备注信息 此函数需要在串口接收中断内进行调用 +//------------------------------------------------------------------------------------------------------------------- +void gnss_uart_callback (void) +{ + uint8 temp_gps[6]; + uint32 temp_length = 0; + + + + + if(gnss_state) + { + uint8 dat; + while(uart_query_byte(GNSS_UART, &dat)) + { + fifo_write_buffer(&gnss_receiver_fifo, &dat, 1); + } + + if('\n' == dat) + { + // 读取前6个数据 用于判断语句类型 + temp_length = 6; + fifo_read_buffer(&gnss_receiver_fifo, temp_gps, &temp_length, FIFO_READ_ONLY); + + // 根据不同类型将数据拷贝到不同的缓冲区 + if(0 == strncmp((char *)&temp_gps[3], "RMC", 3)) + { + // 如果没有在解析数据则更新缓冲区的数据 + if(GPS_STATE_PARSING != gnss_rmc_state) + { + gnss_rmc_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_rmc_buffer, &temp_length, FIFO_READ_AND_CLEAN); + } + } + else if(0 == strncmp((char *)&temp_gps[3], "GGA", 3)) + { + // 如果没有在解析数据则更新缓冲区的数据 + if(GPS_STATE_PARSING != gnss_gga_state) + { + gnss_gga_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_gga_buffer, &temp_length, FIFO_READ_AND_CLEAN); + } + } + else if(0 == strncmp((char *)&temp_gps[3], "THS", 3)) + { + // 如果没有在解析数据则更新缓冲区的数据 + if(GPS_STATE_PARSING != gnss_ths_state) + { + gnss_ths_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_ths_buffer, &temp_length, FIFO_READ_AND_CLEAN); + } + } + + // 统一将FIFO清空 + fifo_clear(&gnss_receiver_fifo); + + gnss_flag = 1; + } + } +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 GPS初始化 +// 参数说明 void +// 返回参数 void +// 使用示例 gps_init(); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +void gnss_init (gps_device_enum gps_device) +{ + 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}; + + if((TAU1201 == gps_device) || (GN42A == gps_device)) + { + fifo_init(&gnss_receiver_fifo, FIFO_DATA_8BIT, gnss_receiver_buffer, GNSS_BUFFER_SIZE); + system_delay_ms(500); // 等待GPS启动后开始初始化 + uart_init(GNSS_UART, 115200, GNSS_RX, GNSS_TX); + + uart_write_buffer(GNSS_UART, (uint8 *)set_rate, sizeof(set_rate)); // 设置GPS更新速率为10hz 如果不调用此语句则默认为1hz + system_delay_ms(200); + + uart_write_buffer(GNSS_UART, (uint8 *)open_rmc, sizeof(open_rmc)); // 开启rmc语句 + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)open_gga, sizeof(open_gga)); // 开启gga语句 + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gll, sizeof(close_gll)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gsa, sizeof(close_gsa)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_grs, sizeof(close_grs)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gsv, sizeof(close_gsv)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_vtg, sizeof(close_vtg)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_zda, sizeof(close_zda)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gst, sizeof(close_gst)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_txt, sizeof(close_txt)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_txt_ant, sizeof(close_txt_ant)); + system_delay_ms(50); + + gnss_state = 1; + uart_rx_interrupt(GNSS_UART, 1); + } + else if(GN43RFA == gps_device) + { + // GN43RFA RTK模块不需要进行参数设置,如果需要修改参数应该使用专用的上位机修改参数 + fifo_init(&gnss_receiver_fifo, FIFO_DATA_8BIT, gnss_receiver_buffer, GNSS_BUFFER_SIZE); + uart_init(GNSS_UART, 115200, GNSS_RX, GNSS_TX); + gnss_state = 1; + uart_rx_interrupt(GNSS_UART, 1); + } + +} diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_gnss.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_gnss.h new file mode 100644 index 0000000..5d58976 --- /dev/null +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_gnss.h @@ -0,0 +1,125 @@ +/********************************************************************************************************************* +* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* Copyright (c) 2022 SEEKFREE 逐飞科技 +* +* 本文件是 TC264 开源库的一部分 +* +* TC264 开源库 是免费软件 +* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 +* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 +* +* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 +* 甚至没有隐含的适销性或适合特定用途的保证 +* 更多细节请参见 GPL +* +* 您应该在收到本开源库的同时收到一份 GPL 的副本 +* 如果没有,请参阅 +* +* 额外注明: +* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 +* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 +* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 +* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) +* +* 文件名称 zf_device_gnss +* 公司名称 成都逐飞科技有限公司 +* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 +* 开发环境 ADS v1.9.20 +* 适用平台 TC264D +* 店铺链接 https://seekfree.taobao.com/ +* +* 修改记录 +* 日期 作者 备注 +* 2023-12-28 pudding first version +********************************************************************************************************************/ +/********************************************************************************************************************* +* 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* RX 查看 zf_device_gnss.h 中 GNSS_RX 宏定义 +* TX 查看 zf_device_gnss.h 中 GNSS_TX 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* ------------------------------------ +********************************************************************************************************************/ + +#ifndef _zf_device_gnss_h_ +#define _zf_device_gnss_h_ + +#include "zf_common_typedef.h" + +//-------------------------------------------------------------------------------------------------- +//引脚配置 +//-------------------------------------------------------------------------------------------------- +#define GNSS_UART (UART_3) +#define GNSS_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 +#define GNSS_TX (UART3_RX_P15_7) // GPS TX串口引脚 + +#define ANGLE_TO_RAD(x) ( (x) * PI / 180.0 ) // 角度转换为弧度 +#define RAD_TO_ANGLE(x) ( (x) * 180.0 / PI ) // 弧度转换为角度 +#define PI ( 3.1415926535898 ) + +typedef enum +{ + TAU1201 = 1, // 逐飞科技双频GPS模块 + GN42A = 1, // 逐飞科技双频GPS模块 与TAU1201是一样的 + GN43RFA = 2, // 逐飞科技三频RTK模块 +}gps_device_enum; + +typedef struct +{ + uint16 year; + uint8 month; + uint8 day; + uint8 hour; + uint8 minute; + uint8 second; +}gps_time_struct; + +typedef struct +{ + gps_time_struct time; // 时间 + + uint8 state; // 有效状态 1:定位有效 0:定位无效 + + uint16 latitude_degree; // 度 + uint16 latitude_cent; // 分 + uint16 latitude_second; // 秒 这里的秒是被放大了100倍的,主要是避免使用浮点数 + uint16 longitude_degree; // 度 + uint16 longitude_cent; // 分 + uint16 longitude_second; // 秒 这里的秒是被放大了100倍的,主要是避免使用浮点数 + + double latitude; // 纬度 + double longitude; // 经度 + + int8 ns; // 纬度半球 N(北半球)或 S(南半球) + int8 ew; // 经度半球 E(东经)或 W(西经) + + float speed; // 速度(公里/每小时) + float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准)+ + uint8 antenna_direction_state; // 双天线测向有效状态 1:测向有效 0:测向无效,无效时antenna_direction数据是无效的 + float antenna_direction; // 主天线指向从天线与真北构成的夹角(000.0~359.9 度) + + // 下面两个个信息从GNGGA语句中获取 + uint8 satellite_used; // 用于定位的卫星数量 + float height; // 高度 +}gnss_info_struct; + +typedef enum +{ + GPS_STATE_RECEIVING, // 正在接收数据 + GPS_STATE_RECEIVED, // 数据接收完成 + GPS_STATE_PARSING, // 正在解析 +}gps_state_enum; + +extern gnss_info_struct gnss; +extern uint8 gnss_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); +uint8 gnss_data_parse (void); +void gnss_uart_callback (void); +void gnss_init (gps_device_enum gps_device); + +#endif diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_gps_tau1201.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_gps_tau1201.c deleted file mode 100644 index da46a99..0000000 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_gps_tau1201.c +++ /dev/null @@ -1,541 +0,0 @@ -/********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 -* Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 -* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 -* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* -* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 -* 甚至没有隐含的适销性或适合特定用途的保证 -* 更多细节请参见 GPL -* -* 您应该在收到本开源库的同时收到一份 GPL 的副本 -* 如果没有,请参阅 -* -* 额外注明: -* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 -* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 -* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 -* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* -* 文件名称 zf_device_gps_tau1201 -* 公司名称 成都逐飞科技有限公司 -* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D -* 店铺链接 https://seekfree.taobao.com/ -* -* 修改记录 -* 日期 作者 备注 -* 2022-09-15 pudding first version -* 2023-04-28 pudding 增加中文注释说明 -********************************************************************************************************************/ -/******************************************************************************************************************** -* 接线定义: -* ------------------------------------ -* 模块管脚 单片机管脚 -* RX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_RX 宏定义 -* TX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_TX 宏定义 -* VCC 3.3V电源 -* GND 电源地 -* ------------------------------------ -********************************************************************************************************************/ - -#include "math.h" -#include "zf_common_function.h" -#include "zf_common_fifo.h" -#include "zf_driver_delay.h" -#include "zf_driver_uart.h" - -#include "zf_device_gps_tau1201.h" - -#define GPS_TAU1201_BUFFER_SIZE ( 128 ) - -uint8 gps_tau1201_flag = 0; // 1:采集完成等待处理数据 0:没有采集完成 -gps_info_struct gps_tau1201; // GPS解析之后的数据 - -static uint8 gps_tau1201_state = 0; // 1:GPS初始化完成 -static fifo_obj_struct gps_tau1201_receiver_fifo; // -static uint8 gps_tau1201_receiver_buffer[GPS_TAU1201_BUFFER_SIZE]; // 数据存放数组 - -gps_state_enum gps_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 -gps_state_enum gps_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 - -static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; // GGA语句缓冲区 -static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; // RMC语句缓冲区 - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 获取指定 ',' 后面的索引 -// 参数说明 num 第几个逗号 -// 参数说明 *str 字符串 -// 返回参数 uint8 返回索引 -// 使用示例 get_parameter_index(1, s); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static uint8 get_parameter_index (uint8 num, char *str) -{ - uint8 i = 0, j = 0; - char *temp = strchr(str, '\n'); - uint8 len = 0, len1 = 0; - - 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; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 给定字符串第一个 ',' 之前的数据转换为int -// 参数说明 *s 字符串 -// 返回参数 float 返回数值 -// 使用示例 get_int_number(&buf[get_parameter_index(7, buf)]); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static int get_int_number (char *s) -{ - char buf[10]; - uint8 i = 0; - int return_value = 0; - i = get_parameter_index(1, s); - i = i - 1; - strncpy(buf, s, i); - buf[i] = 0; - return_value = func_str_to_int(buf); - return return_value; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 给定字符串第一个 ',' 之前的数据转换为float -// 参数说明 *s 字符串 -// 返回参数 float 返回数值 -// 使用示例 get_float_number(&buf[get_parameter_index(8, buf)]); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static float get_float_number (char *s) -{ - uint8 i = 0; - char buf[15]; - float return_value = 0; - - i = get_parameter_index(1, s); - i = i - 1; - strncpy(buf, s, i); - buf[i] = 0; - return_value = (float)func_str_to_double(buf); - return return_value; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 给定字符串第一个 ',' 之前的数据转换为double -// 参数说明 *s 字符串 -// 返回参数 double 返回数值 -// 使用示例 get_double_number(&buf[get_parameter_index(3, buf)]); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static double get_double_number (char *s) -{ - uint8 i = 0; - char buf[15]; - double return_value = 0; - - i = get_parameter_index(1, s); - i = i - 1; - strncpy(buf, s, i); - buf[i] = 0; - return_value = func_str_to_double(buf); - return return_value; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 世界时间转换为北京时间 -// 参数说明 *time 保存的时间 -// 返回参数 void -// 使用示例 utc_to_btc(&gps->time); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static void utc_to_btc (gps_time_struct *time) -{ - uint8 day_num = 0; - - time->hour = time->hour + 8; - if(23 < time->hour) - { - time->hour -= 24; - time->day += 1; - - if(2 == time->month) - { - day_num = 28; - if((0 == time->year % 4 && 0 != time->year % 100) || 0 == time->year % 400) // 判断是否为闰年 - { - day_num ++; // 闰月 2月为29天 - } - } - else - { - day_num = 31; // 1 3 5 7 8 10 12这些月份为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(12 < time->month) - { - time->month -= 12; - time->year ++; - } - } - } -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 RMC语句解析 -// 参数说明 *line 接收到的语句信息 -// 参数说明 *gps 保存解析后的数据 -// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 -// 使用示例 gps_gnrmc_parse((char *)data_buffer, &gps_tau1201); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static uint8 gps_gnrmc_parse (char *line, gps_info_struct *gps) -{ - uint8 state = 0, temp = 0; - - double latitude = 0; // 纬度 - double longitude = 0; // 经度 - - double lati_cent_tmp = 0, lati_second_tmp = 0; - double long_cent_tmp = 0, long_second_tmp = 0; - float speed_tmp = 0; - char *buf = line; - uint8 return_state = 0; - - state = buf[get_parameter_index(2, buf)]; - - gps->state = 0; - if('A' == state) // 如果数据有效 则解析数据 - { - return_state = 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; // 纬度转换为度分秒 - lati_cent_tmp = (latitude - gps->latitude_degree * 100); - gps->latitude_cent = (int)lati_cent_tmp; - lati_second_tmp = (lati_cent_tmp - gps->latitude_cent) * 6000; - gps->latitude_second = (int)lati_second_tmp; - - gps->longitude_degree = (int)longitude / 100; // 经度转换为度分秒 - long_cent_tmp = (longitude - gps->longitude_degree * 100); - gps->longitude_cent = (int)long_cent_tmp; - long_second_tmp = (long_cent_tmp - gps->longitude_cent) * 6000; - gps->longitude_second = (int)long_second_tmp; - - gps->latitude = gps->latitude_degree + lati_cent_tmp / 60; - gps->longitude = gps->longitude_degree + long_cent_tmp / 60; - - speed_tmp = get_float_number(&buf[get_parameter_index(7, buf)]); // 速度(海里/小时) - gps->speed = speed_tmp * 1.85f; // 转换为公里/小时 - gps->direction = get_float_number(&buf[get_parameter_index(8, buf)]); // 角度 - } - - // 在定位没有生效前也是有时间数据的,可以直接解析 - gps->time.hour = (buf[7] - '0') * 10 + (buf[8] - '0'); // 时间 - 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'); // 日期 - 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_state; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 GGA语句解析 -// 参数说明 *line 接收到的语句信息 -// 参数说明 *gps 保存解析后的数据 -// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 -// 使用示例 gps_gngga_parse((char *)data_buffer, &gps_tau1201); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static uint8 gps_gngga_parse (char *line, gps_info_struct *gps) -{ - uint8 state = 0; - char *buf = line; - uint8 return_state = 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)]); // 高度 = 海拔高度 + 地球椭球面相对大地水准面的高度 - return_state = 1; - } - - return return_state; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 计算从第一个点到第二个点的距离 -// 参数说明 latitude1 第一个点的纬度 -// 参数说明 longitude1 第一个点的经度 -// 参数说明 latitude2 第二个点的纬度 -// 参数说明 longitude2 第二个点的经度 -// 返回参数 double 返回两点距离 -// 使用示例 get_two_points_distance(latitude1_1, longitude1, latitude2, longitude2); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -double get_two_points_distance (double latitude1, double longitude1, double latitude2, double longitude2) -{ - const double EARTH_RADIUS = 6378137; // 地球半径(单位:m) - double rad_latitude1 = 0; - double rad_latitude2 = 0; - double rad_longitude1 = 0; - double rad_longitude2 = 0; - double distance = 0; - double a = 0; - double b = 0; - - rad_latitude1 = ANGLE_TO_RAD(latitude1); // 根据角度计算弧度 - 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 里面实现的算法 - distance = distance * EARTH_RADIUS; - - return distance; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 计算从第一个点到第二个点的方位角 -// 参数说明 latitude1 第一个点的纬度 -// 参数说明 longitude1 第一个点的经度 -// 参数说明 latitude2 第二个点的纬度 -// 参数说明 longitude2 第二个点的经度 -// 返回参数 double 返回方位角(0至360) -// 使用示例 get_two_points_azimuth(latitude1_1, longitude1, latitude2, longitude2); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -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 ((0 < angle) ? angle : (angle + 360)); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 解析GPS数据 -// 参数说明 void -// 返回参数 uint8 0-解析成功 1-解析失败 可能数据包错误 -// 使用示例 gps_data_parse(); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -uint8 gps_data_parse (void) -{ - uint8 return_state = 0; - uint8 check_buffer[5] = {'0', 'x', 0x00, 0x00, 0x00}; - uint8 bbc_xor_origin = 0; - uint8 bbc_xor_calculation = 0; - uint32 data_len = 0; - - do - { - if(GPS_STATE_RECEIVED == gps_rmc_state) - { - gps_rmc_state = GPS_STATE_PARSING; - strncpy((char *)&check_buffer[2], strchr((const char *)gps_rmc_buffer, '*') + 1, 2); - bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); - for(bbc_xor_calculation = gps_rmc_buffer[1], data_len = 2; '*' != gps_rmc_buffer[data_len]; data_len ++) - { - bbc_xor_calculation ^= gps_rmc_buffer[data_len]; - } - if(bbc_xor_calculation != bbc_xor_origin) - { - // 数据校验失败 - return_state = 1; - break; - } - - gps_gnrmc_parse((char *)gps_rmc_buffer, &gps_tau1201); - } - gps_rmc_state = GPS_STATE_RECEIVING; - - if(GPS_STATE_RECEIVED == gps_gga_state) - { - gps_gga_state = GPS_STATE_PARSING; - strncpy((char *)&check_buffer[2], strchr((const char *)gps_gga_buffer, '*') + 1, 2); - bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); - - for(bbc_xor_calculation = gps_gga_buffer[1], data_len = 2; '*' != gps_gga_buffer[data_len]; data_len ++) - { - bbc_xor_calculation ^= gps_gga_buffer[data_len]; - } - if(bbc_xor_calculation != bbc_xor_origin) - { - // 数据校验失败 - return_state = 1; - break; - } - - gps_gngga_parse((char *)gps_gga_buffer, &gps_tau1201); - } - gps_gga_state = GPS_STATE_RECEIVING; - - }while(0); - return return_state; -} - - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 GPS串口回调函数 -// 参数说明 void -// 返回参数 void -// 使用示例 gps_uart_callback(); -// 备注信息 此函数需要在串口接收中断内进行调用 -//------------------------------------------------------------------------------------------------------------------- -void gps_uart_callback (void) -{ - uint8 temp_gps[6]; - uint32 temp_length = 0; - - if(gps_tau1201_state) - { - uint8 dat; - while(uart_query_byte(GPS_TAU1201_UART, &dat)) - { - fifo_write_buffer(&gps_tau1201_receiver_fifo, &dat, 1); - } - - if('\n' == dat) - { - // 读取前6个数据 用于判断语句类型 - temp_length = 6; - fifo_read_buffer(&gps_tau1201_receiver_fifo, temp_gps, &temp_length, FIFO_READ_ONLY); - - // 根据不同类型将数据拷贝到不同的缓冲区 - if(0 == strncmp((char *)&temp_gps[3], "RMC", 3)) - { - // 如果没有在解析数据则更新缓冲区的数据 - if(GPS_STATE_PARSING != gps_rmc_state) - { - gps_rmc_state = GPS_STATE_RECEIVED; - temp_length = fifo_used(&gps_tau1201_receiver_fifo); - fifo_read_buffer(&gps_tau1201_receiver_fifo, gps_rmc_buffer, &temp_length, FIFO_READ_AND_CLEAN); - } - } - else if(0 == strncmp((char *)&temp_gps[3], "GGA", 3)) - { - // 如果没有在解析数据则更新缓冲区的数据 - if(GPS_STATE_PARSING != gps_gga_state) - { - gps_gga_state = GPS_STATE_RECEIVED; - temp_length = fifo_used(&gps_tau1201_receiver_fifo); - fifo_read_buffer(&gps_tau1201_receiver_fifo, gps_gga_buffer, &temp_length, FIFO_READ_AND_CLEAN); - } - } - - // 统一将FIFO清空 - fifo_clear(&gps_tau1201_receiver_fifo); - - gps_tau1201_flag = 1; - } - } -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 GPS初始化 -// 参数说明 void -// 返回参数 void -// 使用示例 gps_init(); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -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}; - - fifo_init(&gps_tau1201_receiver_fifo, FIFO_DATA_8BIT, gps_tau1201_receiver_buffer, GPS_TAU1201_BUFFER_SIZE); - system_delay_ms(500); // 等待GPS启动后开始初始化 - uart_init(GPS_TAU1201_UART, 115200, GPS_TAU1201_RX, GPS_TAU1201_TX); - uart_rx_interrupt(GPS_TAU1201_UART, 0); - - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)set_rate, sizeof(set_rate)); // 设置GPS更新速率为10hz 如果不调用此语句则默认为1hz - system_delay_ms(200); - - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)open_rmc, sizeof(open_rmc)); // 开启rmc语句 - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)open_gga, sizeof(open_gga)); // 开启gga语句 - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gll, sizeof(close_gll)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gsa, sizeof(close_gsa)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_grs, sizeof(close_grs)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gsv, sizeof(close_gsv)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_vtg, sizeof(close_vtg)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_zda, sizeof(close_zda)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gst, sizeof(close_gst)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_txt, sizeof(close_txt)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_txt_ant, sizeof(close_txt_ant)); - system_delay_ms(50); - - gps_tau1201_state = 1; - uart_rx_interrupt(GPS_TAU1201_UART, 1); -} diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_gps_tau1201.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_gps_tau1201.h deleted file mode 100644 index c167bae..0000000 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_gps_tau1201.h +++ /dev/null @@ -1,117 +0,0 @@ -/********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 -* Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 -* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 -* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* -* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 -* 甚至没有隐含的适销性或适合特定用途的保证 -* 更多细节请参见 GPL -* -* 您应该在收到本开源库的同时收到一份 GPL 的副本 -* 如果没有,请参阅 -* -* 额外注明: -* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 -* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 -* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 -* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* -* 文件名称 zf_device_gps_tau1201 -* 公司名称 成都逐飞科技有限公司 -* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D -* 店铺链接 https://seekfree.taobao.com/ -* -* 修改记录 -* 日期 作者 备注 -* 2022-09-15 pudding first version -* 2023-04-28 pudding 增加中文注释说明 -********************************************************************************************************************/ -/******************************************************************************************************************** -* 接线定义: -* ------------------------------------ -* 模块管脚 单片机管脚 -* RX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_RX 宏定义 -* TX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_TX 宏定义 -* VCC 3.3V电源 -* GND 电源地 -* ------------------------------------ -********************************************************************************************************************/ - -#ifndef _zf_device_gps_tau1201_h_ -#define _zf_device_gps_tau1201_h_ - -#include "zf_common_typedef.h" - -//=================================================定义 定位模块 基本配置================================================ -#define GPS_TAU1201_UART (UART_3) -#define GPS_TAU1201_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 -#define GPS_TAU1201_TX (UART3_RX_P15_7) // GPS TX串口引脚 - -#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 -#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 -#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; // 时间- - uint8 state; // 有效状态 1:定位有效 0:定位无效 - uint16 latitude_degree; // 度 - uint16 latitude_cent; // 分 - uint16 latitude_second; // 秒 - uint16 longitude_degree; // 度 - uint16 longitude_cent; // 分 - uint16 longitude_second; // 秒 - double latitude; // 纬度 - double longitude; // 经度 - int8 ns; // 纬度半球 N(北半球)或 S(南半球) - int8 ew; // 经度半球 E(东经)或 W(西经) - float speed; // 速度(公里/每小时) - float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) - // 下面两个个信息从GNGGA语句中获取 - uint8 satellite_used; // 用于定位的卫星数量 - float height; // 高度 -}gps_info_struct; - -typedef enum -{ - GPS_STATE_RECEIVING, // 正在接收数据 - GPS_STATE_RECEIVED, // 数据接收完成 - GPS_STATE_PARSING, // 正在解析 -}gps_state_enum; -//================================================定义 定位模块 参数结构体================================================ - - -//=================================================声明 定位模块 全局变量================================================ -extern gps_info_struct gps_tau1201; // GPS解析之后的数据 -extern uint8 gps_tau1201_flag; // 1:采集完成等待处理数据 0:没有采集完成 -//=================================================声明 定位模块 全局变量================================================ - - -//=================================================声明 定位模块 基础函数================================================ -double get_two_points_distance (double lat1, double lng1, double lat2, double lng2); // 计算从第一个点到第二个点的距离(单位:m) -double get_two_points_azimuth (double lat1, double lon1, double lat2, double lon2); // 计算从第一个点到第二个点的方位角(单位:°) -uint8 gps_data_parse (void); // 解析GPS数据 -void gps_uart_callback (void); // GPS回调函数 -void gps_init (void); // GPS初始化 -//=================================================声明 定位模块 基础函数================================================ -#endif diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_icm20602.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_icm20602.c index f4ae830..ddebf3c 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_icm20602.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_icm20602.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_icm20602 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_icm20602.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_icm20602.h index 67724ad..209972b 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_icm20602.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_icm20602.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_icm20602 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_imu660ra.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_imu660ra.c index 95144f9..02fdb9e 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_imu660ra.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_imu660ra.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu660ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_imu660ra.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_imu660ra.h index a689df1..348e6a1 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_imu660ra.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_imu660ra.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu660ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_imu963ra.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_imu963ra.c index 92ec0f6..595142a 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_imu963ra.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_imu963ra.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu963ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_imu963ra.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_imu963ra.h index 4d0d9f9..c0f981f 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_imu963ra.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_imu963ra.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu963ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ips114.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ips114.c index 78c6f3b..b13e338 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ips114.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ips114.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips114 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ips114.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ips114.h index 81dfc3c..ba932b1 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ips114.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ips114.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips114 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ips200.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ips200.c index cd8681f..37d9d04 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ips200.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ips200.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips200 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ips200.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ips200.h index ce59927..045bf27 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ips200.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ips200.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips200 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_key.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_key.c index 9e42c8a..8b240cb 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_key.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_key.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_key * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_key.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_key.h index bcab8aa..9c653cf 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_key.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_key.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_key * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_mpu6050.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_mpu6050.c index dc3c5b2..101a5ae 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_mpu6050.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_mpu6050.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_mpu6050 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_mpu6050.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_mpu6050.h index 3510e06..c8a086f 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_mpu6050.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_mpu6050.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_mpu6050 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_mt9v03x.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_mt9v03x.c index 231cfec..d38b8df 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_mt9v03x.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_mt9v03x.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_mt9v03x * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_mt9v03x.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_mt9v03x.h index 7786bc5..9d4650d 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_mt9v03x.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_mt9v03x.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_mt9v03x * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_oled.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_oled.c index 5314209..55aefa7 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_oled.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_oled.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_oled * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_oled.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_oled.h index d52d2fd..aadf048 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_oled.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_oled.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_oled * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ov7725.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ov7725.c index 12f6095..bac95fe 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ov7725.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ov7725.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ov7725 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ov7725.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ov7725.h index f45a4e8..2cb4026 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ov7725.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ov7725.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ov7725 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_scc8660.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_scc8660.c index 3483c93..38d65ff 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_scc8660.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_scc8660.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_scc8660 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_scc8660.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_scc8660.h index 815d272..537283a 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_scc8660.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_scc8660.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_scc8660 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_tft180.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_tft180.c index db50824..b661e91 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_tft180.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_tft180.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_tft180 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_tft180.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_tft180.h index 47491ee..54a72b3 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_tft180.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_tft180.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_tft180 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_tsl1401.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_tsl1401.c index 3f9db7f..d133c7c 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_tsl1401.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_tsl1401.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_tsl1401 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_tsl1401.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_tsl1401.h index 1fab12e..a7b061c 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_tsl1401.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_tsl1401.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_tsl1401 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_type.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_type.c index 497ba55..af24701 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_type.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_type.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_type * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -32,6 +32,7 @@ * 日期 作者 备注 * 2022-09-15 pudding first version * 2023-05-26 pudding 新增SPI WIFI 中断回调指针 +* 2024-01-16 pudding 移除SPI WIFI 中断回调指针 SPI WIFI将不再使用外部 ********************************************************************************************************************/ #include "zf_device_type.h" @@ -45,7 +46,6 @@ callback_function camera_dma_handler = type_default_callback; wireless_type_enum wireless_type = NO_WIRELESS; callback_function wireless_module_uart_handler = type_default_callback; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 -callback_function wireless_module_spi_handler = type_default_callback; // WIFI SPI GPIO中断函数指针,根据初始化时设置的函数进行跳转 tof_type_enum tof_type = NO_TOF; callback_function tof_module_exti_handler = type_default_callback; // ToF 模块 INT 更新中断 @@ -54,7 +54,7 @@ callback_function tof_module_exti_handler = type_default_callback; // 函数简介 默认回调函数 // 参数说明 void // 返回参数 void -// 使用示例 +// 使用示例 // 备注信息 保护性冗余设计 防止在没有初始化设备的时候跑飞 //------------------------------------------------------------------------------------------------------------------- static void type_default_callback (void) @@ -90,14 +90,7 @@ void set_camera_type (camera_type_enum type_set, callback_function vsync_callba void set_wireless_type (wireless_type_enum type_set, callback_function wireless_callback) { wireless_type = type_set; - if(WIFI_SPI == wireless_type) - { - wireless_module_spi_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); - } - else - { - wireless_module_uart_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); - } + wireless_module_uart_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); } //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_type.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_type.h index 19c36ca..3b124fe 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_type.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_type.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_type * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -56,7 +56,6 @@ typedef enum WIRELESS_UART, // 无线串口 BLUETOOTH_CH9141, // 蓝牙 CH9141 WIFI_UART, // 串口 WiFi - WIFI_SPI // SPI WiFi }wireless_type_enum; typedef enum diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c index 2bdb164..3cbc786 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_virtual_oscilloscope * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h index f518026..b0fd085 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_virtual_oscilloscope * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_wifi_spi.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_wifi_spi.c index 78a6d68..f9e51ca 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_wifi_spi.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_wifi_spi.c @@ -24,14 +24,13 @@ * 文件名称 zf_device_wifi_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 * 日期 作者 备注 -* 2023-05-27 pudding first version -* 2023-05-29 pudding 新增关闭休眠指令,提升通讯效率 +* 2022-09-21 SeekFree first version ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,1374 +52,615 @@ #include "zf_common_clock.h" #include "zf_common_debug.h" #include "zf_common_fifo.h" -#include "zf_common_function.h" #include "zf_driver_delay.h" #include "zf_driver_gpio.h" -#include "zf_common_interrupt.h" -#include "zf_driver_exti.h" #include "zf_driver_spi.h" #include "zf_device_type.h" #include "zf_device_wifi_spi.h" -#define WAIT_TIME_OUT (10000) // 单指令等待时间 单位:ms +#define WIFI_CONNECT_TIME_OUT 10000 // 单位毫秒 +#define SOCKET_CONNECT_TIME_OUT 50000 // 单位毫秒 +#define OTHER_TIME_OUT 1000 // 单位毫秒 -#define WIFI_SPI_WRITE_MAX 128 // 定义一次SPI通讯最大发送的数据长度 - -#define WIFI_SPI_WRITE_REQUEST 0x01 -#define WIFI_SPI_CHECK_STATE 0x02 -#define WIFI_SPI_WRITE_DATA 0x03 -#define WIFI_SPI_READ_DATA 0x04 -#define WIFI_SPI_WRITE_END 0x07 -#define WIFI_SPI_READ_END 0x08 - -#define WIFI_SPI_WRITE_ADDR 0x00 -#define WIFI_SPI_STATE_ADDR 0x04 +char wifi_spi_version[12]; // 保存模块固件版本信息 +char wifi_spi_mac_addr[20]; // 保存模块MAC地址信息 +char wifi_spi_ip_addr_port[25]; // 保存模块IP地址与端口信息 -volatile wifi_spi_buffer_state_enum wifi_buffer_state; -volatile wifi_spi_transmit_state_enum wifi_transmit_state; - -static fifo_obj_struct wifi_spi_fifo; -static uint8 wifi_spi_buffer[WIFI_SPI_BUFFER_SIZE]; // 数据存放数组 - -vuint8 wifi_spi_ack_flag = 0; // 0:模块未应答 1:模块已应答 -uint8 wifi_spi_init_flag; // 0:模块未初始化成功或者未连接 1:模块已连接并成功初始化 -vuint8 wifi_spi_packet_num; // 发送的数据包ID -vuint32 wifi_spi_send_remain_length; // 剩余的发送长度 - - - -wifi_spi_information_struct wifi_spi_information; +static fifo_struct wifi_spi_fifo; +static uint8 wifi_spi_buffer[WIFI_SPI_RECVIVE_FIFO_SIZE]; +static volatile wifi_spi_state_enum wifi_spi_mutex; //------------------------------------------------------------------------------------------------------------------- -// 函数简介 请求写入数据到模块 -// 参数说明 length 需要写入的长度 -// @return void -// Sample usage: +// 函数简介 等待WIFI SPI就绪 +// 参数说明 wait_time 最大等待时间 单位毫秒 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_write_request(uint16 length) +static uint8 wifi_spi_wait_idle (uint32 wait_time) { - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_REQUEST; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - head.magic = 0xFE; - head.sequence = wifi_spi_packet_num++; - head.length = length; + uint32 time = 0; - wifi_transmit_state = TRANSMIT_WRITE_REQUEST; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 7); - gpio_set_level(WIFI_SPI_CS_PIN, 1); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 读取模块状态 -// 参数说明 *length 需要读取或者写入的长度 -// @return WIFI_SPI_BUFFER_STATE_enum 模块状态 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static wifi_spi_buffer_state_enum wifi_spi_read_state(uint16 *length) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_CHECK_STATE; - head.addr = WIFI_SPI_STATE_ADDR; - head.dummy = 0x00; - - wifi_spi_ack_flag = 0; - wifi_transmit_state = TRANSMIT_READ_STATE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_transfer_8bit(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, &head.cmd, 7); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - - if(BUFFER_WRITE == head.magic) + wait_time = wait_time*100; + while(0 == gpio_get_level(WIFI_SPI_INT_PIN)) { - wifi_spi_packet_num = head.sequence; - } - *length = head.length; - - return (wifi_spi_buffer_state_enum)head.magic; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据发送完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_done(void) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_END; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_transmit_state = TRANSMIT_IDLE; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据接收完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_start(void) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_READ_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - wifi_transmit_state = TRANSMIT_READ; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据接收完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_done(void) -{ - wifi_spi_buffer_struct head; - - gpio_set_level(WIFI_SPI_CS_PIN, 1); - - head.cmd = WIFI_SPI_READ_END; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_transmit_state = TRANSMIT_IDLE; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块 -// 参数说明 *buff 需要写入数据的首地址 -// 参数说明 length 需要写入数据的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_data(const uint8 *buff, uint16 length) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - wifi_transmit_state = TRANSMIT_WRITE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - spi_write_8bit_array(WIFI_SPI_INDEX, buff, length); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_spi_send_done(); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_data_multi(wifi_spi_send_multi_struct *multi_buffer) -{ - uint8 i; - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - wifi_transmit_state = TRANSMIT_WRITE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - - for(i = 0; i < WIFI_SPI_MAX_MULTI; i++) - { - if(NULL != multi_buffer->source[i]) spi_write_8bit_array(WIFI_SPI_INDEX, multi_buffer->source[i], multi_buffer->length[i]); - } - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_spi_send_done(); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 接收模块发送的数据 -// 参数说明 *buff 接收数组的缓冲区首地址 -// 参数说明 length 需要接收的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_data(uint8 *buff, uint16 length) -{ - spi_read_8bit_array(WIFI_SPI_INDEX, buff, length); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送命令到模块 -// 参数说明 *str 命令字符串首地址 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_command(const char *str) -{ - uint8 state = 0; - uint16 send_length; - uint16 wait_time = 0; - - // 请求发送数据 - send_length = (uint16)strlen(str); - - // 等待传输进入空闲 - while(TRANSMIT_IDLE != wifi_transmit_state); - - // 如果没有进入发送状态则重新请求发送数据 - while(BUFFER_WRITE != wifi_buffer_state) - { - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - while(!wifi_spi_ack_flag) - { - wait_time++; - if((WAIT_TIME_OUT / 4) <= wait_time) - { - state = 1; - wifi_spi_init_flag = 0; // 模块已断开 - break; - } - system_delay_ms(1); - } - - if(1 == state) + system_delay_us(10); + time++; + if(wait_time <= time) { break; } } - - wifi_buffer_state = BUFFER_IDLE; - - if(0 == state) // 通讯未超时 - { - wifi_spi_send_remain_length = send_length; - // 发送消息 - wifi_spi_send_data((const uint8 *)str, send_length); - } + return (wait_time <= time); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 检查模块状态并读取模块发送的数据 -// 参数说明 void -// @return void -// Sample usage: +// 函数简介 写入数据到WIFI SPI +// 参数说明 *buffer1 第一组需要发送的数据缓冲区地址 +// 参数说明 length1 第一组数据长度 +// 参数说明 *buffer2 第二组需要发送的数据缓冲区地址 +// 参数说明 length2 第二组数据长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -void wifi_spi_check_state_read_buffer(void) +static void wifi_spi_write (const uint8 *buffer1, uint16 length1, const uint8 *buffer2, uint16 length2) { - uint16 wifi_spi_receive_length; // 本次接收到的数据数量 - uint8 wifi_spi_receive_buffer[WIFI_SPI_WRITE_MAX]; - - // 查询WIFI模块的状态 - wifi_buffer_state = wifi_spi_read_state(&wifi_spi_receive_length); - - // 如果需要读取WIFI模块数据,则保存需要读取的长度 - if(BUFFER_READ == wifi_buffer_state) + gpio_low(WIFI_SPI_CS_PIN); + if(NULL != buffer1) { - wifi_spi_receive_start(); - do - { - if(wifi_spi_receive_length > WIFI_SPI_WRITE_MAX) - { - wifi_spi_receive_data((uint8 *)wifi_spi_receive_buffer, WIFI_SPI_WRITE_MAX); - fifo_write_buffer(&wifi_spi_fifo, wifi_spi_receive_buffer, WIFI_SPI_WRITE_MAX); // 存入 FIFO - wifi_spi_receive_length = wifi_spi_receive_length - WIFI_SPI_WRITE_MAX; - } - else - { - wifi_spi_receive_data((uint8 *)wifi_spi_receive_buffer, wifi_spi_receive_length); - fifo_write_buffer(&wifi_spi_fifo, wifi_spi_receive_buffer, wifi_spi_receive_length); // 存入 FIFO - wifi_spi_receive_length = 0; - } - }while(wifi_spi_receive_length > 0); - wifi_spi_receive_done(); + spi_write_8bit_array(WIFI_SPI_INDEX, buffer1, length1); } - else if(BUFFER_IDLE == wifi_buffer_state) + if(NULL != buffer2) { - // 如果模块内部缓冲区状态为空闲,则传输状态也设置为空闲 - wifi_transmit_state = TRANSMIT_IDLE; + spi_write_8bit_array(WIFI_SPI_INDEX, buffer2, length2); } + gpio_high(WIFI_SPI_CS_PIN); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块 -// 参数说明 *buff 需要发送的数据首地址 -// 参数说明 length 需要发送的长度 -// @return uint32 剩余未发送长度 -// Sample usage: +// 函数简介 WIFI SPI 发送与接收同时进行(命令收发) +// 参数说明 *packets 发送与接收的地址 +// 参数说明 length 需要接收的长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_write_data(const uint8 *buff, uint32 length) +static void wifi_spi_transfer_command (wifi_spi_packets_struct *packets, uint16 length) { - uint16 send_length; - uint32 wait_time; + gpio_low(WIFI_SPI_CS_PIN); - // 记录需要发送的长度 - wifi_spi_send_remain_length = length; - - while(wifi_spi_send_remain_length) + spi_transfer_8bit(WIFI_SPI_INDEX, (uint8 *)&(packets->head), (uint8 *)&(packets->head), sizeof(wifi_spi_head_struct)); + + if(length) { - send_length = (uint16)func_limit_ab(wifi_spi_send_remain_length, 1, WIFI_SPI_WRITE_MAX); - - // 请求发送数据 - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - - // 最长等待5秒 - wait_time = 5000; - while(!wifi_spi_ack_flag) - { - wait_time--; - if(0 == wait_time) break; - system_delay_ms(1); - } - - if(BUFFER_WRITE == wifi_buffer_state) - { - // 发送消息 - wifi_spi_send_data(buff, send_length); - buff += send_length; - wifi_spi_send_remain_length -= send_length; - wifi_buffer_state = BUFFER_IDLE; - } - else - { - break; - } + spi_transfer_8bit(WIFI_SPI_INDEX, (const uint8 *)(packets->buffer), packets->buffer, length); } - - return wifi_spi_send_remain_length; + + gpio_high(WIFI_SPI_CS_PIN); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// @return uint32 剩余未发送长度 -// Sample usage: 发送数据总长度不能超过4092个 +// 函数简介 WIFI SPI 发送与接收同时进行(数据收发) +// 参数说明 *write_data 发送的数据缓冲区地址 +// 参数说明 *read_data 接收到的数据的存储地址 +// 参数说明 length 需要接收的长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_write_data_multi(wifi_spi_send_multi_struct *multi_buffer) +static void wifi_spi_transfer_data (const uint8 *write_data, wifi_spi_packets_struct *read_data, uint16 length) { - uint16 send_length; - uint32 wait_time; + gpio_low(WIFI_SPI_CS_PIN); - // 记录需要发送的长度 - send_length = multi_buffer->length[0] + multi_buffer->length[1] + multi_buffer->length[2] + multi_buffer->length[3] + multi_buffer->length[4] + multi_buffer->length[5] + multi_buffer->length[6] + multi_buffer->length[7]; + read_data->head.command = WIFI_SPI_DATA; + read_data->head.length = length; - if(WIFI_SPI_WRITE_MAX >= send_length) + spi_transfer_8bit(WIFI_SPI_INDEX, (uint8 *)&(read_data->head), (uint8 *)&(read_data->head), sizeof(wifi_spi_head_struct)); + + if(WIFI_SPI_RECVIVE_SIZE < length) { - // 请求发送数据 - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - - // 最长等待5秒 - wait_time = 5000; - while(!wifi_spi_ack_flag) - { - wait_time--; - if(0 == wait_time) break; - system_delay_ms(1); - } - - if(BUFFER_WRITE == wifi_buffer_state) - { - // 发送消息 - wifi_spi_send_data_multi(multi_buffer); - send_length = 0; - wifi_buffer_state = BUFFER_IDLE; - } + spi_transfer_8bit(WIFI_SPI_INDEX, write_data, read_data->buffer, WIFI_SPI_RECVIVE_SIZE); + spi_write_8bit_array(WIFI_SPI_INDEX, &write_data[WIFI_SPI_RECVIVE_SIZE], length - WIFI_SPI_RECVIVE_SIZE); } - - return send_length; + else + { + // 将需要发送的数据拷贝到读取缓冲区,避免出现write_data越界访问 + memcpy(read_data->buffer, write_data, length); + spi_transfer_8bit(WIFI_SPI_INDEX, read_data->buffer, read_data->buffer, WIFI_SPI_RECVIVE_SIZE); + } + gpio_high(WIFI_SPI_CS_PIN); } -//-------------------------------------------------------------------------------------------------- -// 函数简介 等待模块响应 -// 参数说明 *wait_buffer 等待的响应的字符串 -// 参数说明 timeout 超时时间 -// 返回参数 uint8 0:模块响应指定数据 1:模块未响应指定数据或超时 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_wait_ack (char *wait_buffer, uint32 timeout) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 参数设置 +// 参数说明 command 命令类型 +// 参数说明 *buffer 参数地址 +// 参数说明 length 参数长度 +// 参数说明 wait_time 最大等待时间 单位100微妙 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_set_parameter (wifi_spi_packets_command_enum command, uint8 *buffer, uint16 length, uint32 wait_time) { - uint8 return_state = 1; - char receiver_buffer[8] = {0, 0, 0, 0, 0, 0, 0, 0}; - uint32 receiver_len = 8; - + uint8 return_state; + wifi_spi_head_struct head; + return_state = 1; do { - system_delay_ms(1); - // 判断接收缓冲区内是否有需要响应的指定数据 如果有 则跳出循环并且返回0 - receiver_len = 8; - fifo_read_tail_buffer(&wifi_spi_fifo, (uint8 *)receiver_buffer, &receiver_len, FIFO_READ_ONLY); + head.command = command; + head.length = length; + + // 等待从机准备就绪 + if(wifi_spi_wait_idle(wait_time)) + { + break; + } - if(strstr(receiver_buffer, wait_buffer)) + wifi_spi_write(&head.command, sizeof(wifi_spi_head_struct), buffer, length); + if(wifi_spi_wait_idle(wait_time)) + { + break; + } + // 接收应答信号 + + head.command = WIFI_SPI_DATA; + head.length = 0; + wifi_spi_transfer_command((wifi_spi_packets_struct *)&head, head.length); + system_delay_us(20); + if(WIFI_SPI_REPLY_OK == head.command) { return_state = 0; - break; } - else if(strstr(receiver_buffer, "ERROR") || strstr(receiver_buffer, "busy")) - { - // 如果接收到报错或者模块忙 则跳出循环并且返回1 - return_state = 1; - break; - } - }while(timeout --); + }while(0); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 清除WiFi接收缓冲区内容 -// 参数说明 void -// 返回参数 void -// 使用示例 wifi_spi_clear_receive_buffer(); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static void wifi_spi_clear_receive_buffer (void) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 模块信息获取 +// 参数说明 command 命令类型 +// 参数说明 *buffer 保存接收到的参数地址 +// 参数说明 wait_time 最大等待时间 单位100微妙 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_parameter (wifi_spi_packets_command_enum command, wifi_spi_packets_struct *read_data, uint32 wait_time) { - // 清空WiFi接收缓冲区 - fifo_clear(&wifi_spi_fifo); -} + uint8 return_state; -//-------------------------------------------------------------------------------------------------- -// 函数简介 模块数据解析 -// 参数说明 *target_buffer 目标存放地址指针 字符串数组 -// 参数说明 *origin_buffer 数据来源地址指针 字符串数组 -// 参数说明 start_char 起始提取字节 例如从 "1234" 中从 '2' 开始提取 就应该填入 '2' -// 参数说明 end_char 结束提取字节 例如从 "1234" 中在 '4' 结束提取 就应该填入 '\0'(0x00 空字符 一般是字符串结尾) -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_data_parse(wifi_spi_information.mac, wifi_spi_receive_buffer, '"', '"'); // 调用获取本机mac地址后,调用此函数提取mac地址 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char start_char, char end_char) -{ - uint8 return_state = 0; - char *location1; - char *location2; - location1 = strchr((char *)origin_buffer, start_char); - if(location1) + return_state = 1; + do { - location1 ++; - location2 = strchr(location1, end_char); - if(location2) + // 等待从机准备就绪 + if(wifi_spi_wait_idle(wait_time)) { - memcpy(target_buffer, location1, location2-location1); + break; } - else + read_data->head.command = command; + wifi_spi_write(&(read_data->head.command), WIFI_SPI_RECVIVE_SIZE, NULL, 0); + + if(wifi_spi_wait_idle(wait_time)) { - return_state = 1; + break; } - } - else - { - return_state = 1; - } + read_data->head.command = WIFI_SPI_DATA; + read_data->head.length = 0; + wifi_spi_transfer_command(read_data, WIFI_SPI_RECVIVE_SIZE); + return_state = 0; + }while(0); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 查看模块版本信息 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_get_version(); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 固件版本获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,固件版本信息以字符串形式保存在wifi_spi_version数组中 +//------------------------------------------------------------------------------------------------------------------- static uint8 wifi_spi_get_version (void) { - char *location1; - uint8 return_state = 0; - uint8 receiver_buffer[256]; - uint32 receiver_len = 256; + uint8 return_state; + wifi_spi_packets_struct temp_packets; - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+GMR\r\n"); - do + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_VERSION, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_VERSION == temp_packets.head.command)) { - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - location1 = strrchr((char *)receiver_buffer, ':'); - if(wifi_spi_data_parse(wifi_spi_information.version, (uint8 *)location1, ':', '(')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - + memcpy(wifi_spi_version, temp_packets.buffer, temp_packets.head.length); + } return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 模块回显设置 -// 参数说明 model 0:关闭模块的回写功能 其他:开启模块回写 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_echo_set("1");//开启模块回写功能 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_echo_set (char *model) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI MAC地址获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,MAC地址信息以字符串形式保存在wifi_spi_mac_addr数组中 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_mac_addr (void) { - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - if('1' == *model) + uint8 return_state; + wifi_spi_packets_struct temp_packets; + + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_MAC_ADDR, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_MAC_ADDR == temp_packets.head.command)) { - wifi_spi_send_command("ATE1\r\n"); + memcpy(wifi_spi_mac_addr, temp_packets.buffer, temp_packets.head.length); + } + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI IP地址与端口号获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 +// 需要在连接Socket之后调用此函数才能正常获取信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_ip_addr_port (void) +{ + uint8 return_state; + wifi_spi_packets_struct temp_packets; + + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_IP_ADDR, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_IP_ADDR == temp_packets.head.command)) + { + memcpy(wifi_spi_ip_addr_port, temp_packets.buffer, temp_packets.head.length); + } + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 设置连接的WiFi信息并尝试连接WiFi +// 参数说明 *wifi_ssid WIFI名称 +// 参数说明 *pass_word WIFI密码 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_wifi_connect("SEEKFREE", "SEEKFREE123"); +// 备注信息 wifi_spi_wifi_connect("SEEKFREE", NULL); // 连接没有密码的WIFI热点 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_wifi_connect (char *wifi_ssid, char *pass_word) +{ + uint8 return_state; + uint8 temp_buffer[64]; + uint16 length; + + if(NULL != pass_word) + { + // WIFI热点有密码发送热点名称与密码 + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n%s\r\n", wifi_ssid, pass_word); } else { - wifi_spi_send_command("ATE0\r\n"); + // WIFI热点没有密码只需要发送热点名称 + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n", wifi_ssid); } - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + return_state = wifi_spi_set_parameter(WIFI_SPI_SET_WIFI_INFORMATION, temp_buffer, length, WIFI_CONNECT_TIME_OUT); + + // 本机IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 + wifi_spi_get_ip_addr_port(); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块自身 的 MAC 地址 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_mac()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_mac (void) -{ - uint8 return_state = 0; - uint8 receiver_buffer[64]; - uint32 receiver_len = 64; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPAPMAC?\r\n"); - do - { - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - if(wifi_spi_data_parse(wifi_spi_information.mac, receiver_buffer, '"', '"')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块或者目标WIFI 的 IP 地址(取决于模块当前的工作模式) -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_ip()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_ip (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_STATION == wifi_spi_information.mode) - { - wifi_spi_send_command("AT+CIPSTA?\r\n"); - } - else if(WIFI_SPI_SOFTAP == wifi_spi_information.mode) - { - wifi_spi_send_command("AT+CIPAP?\r\n"); - } - - do - { - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - uint8 receiver_buffer[128]; - uint32 receiver_len = 128; - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - if(wifi_spi_data_parse(wifi_spi_information.local_ip, receiver_buffer, '"', '"')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块的相关信息 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_information()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_information (void) -{ - uint8 return_state = 0; - do - { - // 获取模块版本号 - if(wifi_spi_get_version()) - { - return_state = 1; - break; - } - // 获取模块IP地址 - if(wifi_spi_get_ip()) - { - return_state = 1; - break; - } - // 获取模块MAC信息 - if(wifi_spi_get_mac()) - { - return_state = 1; - break; - } - memcpy(wifi_spi_information.local_port, "no port", 7); - }while(0); - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 连接 WiFi -// 参数说明 wifi_ssid WiFi名称 -// 参数说明 pass_word WiFi密码 -// 参数说明 model 0:查询WiFi连接情况 其他:连接WiFi -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_get_or_connect_wifi("WiFi_name", "Pass_word", 1); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_wifi (char *wifi_ssid, char *pass_word) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SOFTAP == wifi_spi_information.mode) - { - sprintf(temp, "AT+CWSAP=\"%s\",\"%s\",5,3\r\n", wifi_ssid, pass_word); - wifi_spi_send_command(temp); - } - else - { - sprintf(temp, "AT+CWJAP=\"%s\",\"%s\"\r\n", wifi_ssid, pass_word); - wifi_spi_send_command(temp); - } - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 上电是否自动连接WiFi -// 参数说明 model 0:上电不自动连接wifi 其他:上电自动连接wifi -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_auto_connect_wifi(0); //上电不自动连接wifi -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_auto_connect_wifi (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CWAUTOCONN=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置连接模式 -// 参数说明 model 0: 单连接模式 1:多连接模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_connect_model("1"); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_connect_model (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPMUX=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置传输模式 -// 参数说明 model – 0: 普通传输模式 IP断开后不重新连接 -// – 1: Wi-Fi 透传接收模式,仅支持 TCP 单连接、UDP 固定通信对端、SSL 单连接的情况 IP断开后会不断尝试重新连接 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_transfer_model("1"); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_transfer_model (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPMODE=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置模块模式 (Station/SoftAP/Station+SoftAP) -// 参数说明 state 0:无 Wi-Fi 模式,并且关闭 Wi-Fi RF----1: Station 模式----2: SoftAP 模式----3: SoftAP+Station 模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_model("1"); +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 设置连接的Socket信息并尝试连接Socket +// 参数说明 *transport_type 传输类型 +// 参数说明 *ip_addr IP地址 +// 参数说明 *port 目标端口号 +// 参数说明 *local_port 本机端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_socket_connect("TCP", "192.168.2.5", "8080", "6060"); // 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_set_model (wifi_spi_mode_enum mode) +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_socket_connect (char *transport_type, char *ip_addr, char *port, char *local_port) { - uint8 return_state = 0; + uint8 return_state; + uint8 temp_buffer[41]; + uint16 length; + + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n%s\r\n%s\r\n%s\r\n", transport_type, ip_addr, port, local_port); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + return_state = wifi_spi_set_parameter(WIFI_SPI_SET_SOCKET_INFORMATION, temp_buffer, length, SOCKET_CONNECT_TIME_OUT); - if(WIFI_SPI_SOFTAP == mode) - { - wifi_spi_send_command("AT+CWMODE=2\r\n"); - } - else - { - wifi_spi_send_command("AT+CWMODE=1\r\n"); - } - // 设置模块工作模式 - wifi_spi_information.mode = mode; - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + // 本机IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 + wifi_spi_get_ip_addr_port(); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 关闭睡眠模式 -// 参数说明 mode -// 返回参数 uint8 0:成功 1:失败 +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 断开Socket连接 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_socket_disconnect(); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_socket_disconnect (void) +{ + wifi_spi_packets_struct temp_packets; + + return wifi_spi_get_parameter(WIFI_SPI_CLOSE_SOCKET, &temp_packets, OTHER_TIME_OUT); +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 软复位 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 // 使用示例 // 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_close_sleep_model (void) +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_reset (void) { - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+SLEEP=0\r\n"); - // 设置模块工作模式 - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 断开与wifi的连接 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_disconnected_wifi(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_disconnected_wifi (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CWQAP\r\n"); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 进入打开透传模式 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_entry_serianet(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_entry_serianet (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPSEND\r\n"); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 退出透传模式 -// 参数说明 model 0:关闭透传模式 其他:开启透传模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_exit_serianet(1); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_exit_serianet (void) -{ - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - system_delay_ms(20); - wifi_spi_send_command("+++"); - system_delay_ms(1000); - - return 0; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 建立TCP连接 -// 参数说明 ip 远端 IPv4 地址、IPv6 地址,或域名 -// 参数说明 port 远端端口值 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_connect_tcp_servers("192.168.101.110", "8080"); -// 备注信息 如果总是连接不上电脑的TCP服务器 可以尝试使用网线连接电脑 -// 如果是使用WiFi连接 可能会导致模块连接TCP服务器等待较长时间 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_connect_tcp_servers (char *ip, char *port, wifi_spi_transfer_mode_enum mode) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + uint8 return_state; + wifi_spi_head_struct head; + return_state = 1; do { - if(wifi_spi_set_connect_model("0")) + head.command = WIFI_SPI_RESET; + head.length = 0xA5A5; + return_state = wifi_spi_wait_idle(OTHER_TIME_OUT); + if(return_state) { - return_state = 1; break; } + wifi_spi_write(&head.command, sizeof(wifi_spi_head_struct), NULL, 0); + }while(0); + + return return_state; +} - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPSTARTEX=\"TCP\",\"%s\",%s\r\n", ip, port); - wifi_spi_send_command(temp); - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI UDP模式时立即发送函数 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 在UDP模式下模块收到数据后会等待2毫秒,2毫秒后未收到数据则将数据通过socket发送到网络,如果希望立即发送则在数据传输完毕后调用此函数 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_udp_send_now (void) +{ + uint8 return_state = 1; + wifi_spi_packets_struct temp_packets; + + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + do { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - // 设置传输模式 - if(wifi_spi_set_transfer_model(WIFI_SPI_COMMAND == mode ? "0" : "1")) - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPSTATE?\r\n"); - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - else - { - uint8 receiver_buffer[128]; - uint32 receiver_len = 128; - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - char* buffer_index = (char *)receiver_buffer; - char* end_index; - - buffer_index += 22; - buffer_index += strlen(ip); - buffer_index += strlen(port); - end_index = strchr(buffer_index, ','); - - memcpy(wifi_spi_information.local_port, " ", 7); - memcpy(wifi_spi_information.local_port, buffer_index, (end_index - buffer_index)); - } - - wifi_spi_information.connect_state = WIFI_SPI_SERVER_ON; - wifi_spi_information.connect_mode = WIFI_SPI_TCP_CLIENT; - wifi_spi_information.transfer_mode = mode; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SERIANET == mode) // 透传模式下直接开启透传 - { - if(wifi_spi_entry_serianet()) + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) { - return_state = 1; break; } - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 建立UDP连接 -// 参数说明 *ip 远端 IPv4 地址、IPv6 地址 或域名 字符串形式 -// 参数说明 *port 远端端口值 字符串形式 -// 参数说明 *local_port 远端 IPv4 地址、IPv6 地址 或域名 字符串形式 -// 参数说明 mode 模块数据通信模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_connect_udp_client("192.168.101.110", "8080", "8080", WIFI_SPI_COMMAND); -// 备注信息 自动分配ID -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_connect_udp_client (char *ip, char *port, char *local_port, wifi_spi_transfer_mode_enum mode) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - do - { - if(wifi_spi_set_connect_model("0")) - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + // 立即开始socket发送 + temp_packets.head.command = WIFI_SPI_UDP_SEND; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + + // 等待应答信号 + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + + // 接收应答信号 + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, temp_packets.head.length); + + if(WIFI_SPI_REPLY_OK == temp_packets.head.command) + { + return_state = 0; + } + + }while(0); - sprintf(temp, "AT+CIPSTARTEX=\"UDP\",\"%s\",%s,%s\r\n", ip, port, local_port); - wifi_spi_send_command(temp); + // 将通讯状态设置为空闲 + wifi_spi_mutex = WIFI_SPI_IDLE; + } + + return return_state; +} - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 数据块发送函数并同步接收数据 +// 参数说明 *buff 需要发送的数据地址 +// 参数说明 length 发送长度 +// 返回参数 uint32 剩余未发送的长度 +// 使用示例 wifi_spi_send_buffer(buffer, 100); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +uint32 wifi_spi_send_buffer (const uint8 *buffer, uint32 length) +{ + uint16 send_length; + wifi_spi_packets_struct temp_packets; + + // 检查WIFI SPI状态,如果在其他中断或者线程中已经发起了通讯,则本次不能发送数据 + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + + while(length) { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_spi_set_transfer_model(WIFI_SPI_COMMAND == mode ? "0" : "1")) // 设置传输模式 - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SERIANET == mode) // 透传模式下直接开启透传 - { - if(wifi_spi_entry_serianet()) + send_length = length > WIFI_SPI_TRANSFER_SIZE ? (uint16)WIFI_SPI_TRANSFER_SIZE : (uint16)length; + + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) { - return_state = 1; break; } - } - memcpy(wifi_spi_information.local_port, " ", 7); - memcpy(wifi_spi_information.local_port, local_port, strlen(local_port)); - wifi_spi_information.connect_state = WIFI_SPI_SERVER_ON; - wifi_spi_information.connect_mode = WIFI_SPI_UDP_CLIENT; - wifi_spi_information.transfer_mode = mode; - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 断开连接 TCP Server 使用本接口将会断开所有连接 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_disconnect_link(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_disconnect_link (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - do - { - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - wifi_spi_send_command("AT+CIPCLOSE=5\r\n"); - } - else - { - wifi_spi_send_command("AT+CIPCLOSE\r\n"); - } - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送字节函数 -// 参数说明 data 需要发送的数据 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_byte(0xa5); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_byte (uint8 data) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - send_length = 1; - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data(&data, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else - { - send_length = (uint16)wifi_spi_write_data(&data, send_length); - } - } - } - - return send_length; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送缓冲区函数 -// 参数说明 buff 需要发送的数据地址 -// 参数说明 len 发送长度 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_buffer("123", 3); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 len) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - while(len) - { - if((WIFI_SPI_WRITE_MAX * 2) < len) send_length = WIFI_SPI_WRITE_MAX * 2; - else - { - send_length = (uint16)len; - } - len -= send_length; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data(buff, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } - buff += send_length; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else - { - len = wifi_spi_write_data(buff, len); - } - } - } - - return len; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送缓冲区函数(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 -// 备注信息 需要发送多个数组时,采用此函数可以极大的降低通讯时间,发送数据总长度不能超过4092 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_buffer_multi (wifi_spi_send_multi_struct *multi_buffer) -{ - uint8 i; - uint16 remain_length; - - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - for(i = 0; i < WIFI_SPI_MAX_MULTI; i++) - { - if(multi_buffer->source[i]) wifi_spi_send_buffer(multi_buffer->source[i], multi_buffer->length[i]); - } - } - else - { - remain_length = (uint16)wifi_spi_write_data_multi(multi_buffer); - } - } - } - - return remain_length; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送字符串函数 -// 参数说明 *str 需要发送的数据 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_string("123"); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_string (const char *str) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - send_length = (uint16)strlen(str); - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data((uint8 *)str, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } + wifi_spi_transfer_data(buffer, &temp_packets, send_length); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) { - send_length = (uint16)wifi_spi_write_data((uint8 *)str, send_length); + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + + length -= send_length; + buffer += send_length; + } + + // 检查最后一次的接收是否将所有的数据都接收完毕 + while(WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) + { + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + + // 继续读取模块剩余数据 + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } } } + wifi_spi_mutex = WIFI_SPI_IDLE; } - - return send_length; + return length; } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi 模块数据接收函数 -// 参数说明 buffer 接收数据的存放地址 -// 参数说明 len 数组长度,可直接填写或者使用sizeof求得 -// 返回参数 uint32 返回实际接收到的数据长度 -// 使用示例 uint8 test_buffer[256]; wifi_spi_read_buffer(&test_buffer[0], sizeof(test_buffer)); +// 函数简介 WIFI SPI 读取缓冲区 +// 参数说明 *buff 接收缓冲区 +// 参数说明 length 读取数据长度 +// 返回参数 uint32 实际读取数据长度 +// 使用示例 wifi_spi_read_buffer(buffer, 100); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 len) +uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 length) { - fifo_read_buffer(&wifi_spi_fifo, buffer, &len, FIFO_READ_AND_CLEAN); - return len; + zf_assert(NULL != buffer); + uint32 data_len = length; + +#if(1 == WIFI_SPI_READ_TRANSFER) + + wifi_spi_packets_struct temp_packets; + // 检查WIFI SPI状态,如果在其他中断或者线程中已经发起了通讯,则本次不能发送数据 + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + + // 发起通讯查看模块内是否有数据未读取 + do + { + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + }while(WIFI_SPI_REPLY_DATA_START == temp_packets.head.command); + wifi_spi_mutex = WIFI_SPI_IDLE; + } +#endif + + fifo_read_buffer(&wifi_spi_fifo, buffer, &data_len, FIFO_READ_AND_CLEAN); + return data_len; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 wifi spi handshake中断回调函数 -// 参数说明 void -// 返回参数 void -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -void wifi_spi_callback (void) -{ - wifi_spi_check_state_read_buffer(); - wifi_spi_ack_flag = 1; // ACK标志位置1 -} - - //------------------------------------------------------------------------------------------------------------------- // 函数简介 WiFi 模块初始化 // 参数说明 *wifi_ssid 目标连接的 WiFi 的名称 字符串形式 // 参数说明 *pass_word 目标连接的 WiFi 的密码 字符串形式 -// 参数说明 wifi_mode 模块的工作模式 参照 zf_device_wireless_spi.h 中 wifi_spi_mode_enum 枚举 // 返回参数 uint8 模块初始化状态 0-成功 1-错误 -// 使用示例 wifi_spi_init("SEEKFREE_2.4G", "SEEKFREEV2", WIFI_UART_STATION); -// 备注信息 初始化会首先设置串口配置,之后会对模块进行基本参数配置 -// 具体的配置信息可以在 zf_device_wireless_spi.h 文件中修改 +// 使用示例 wifi_spi_init("SEEKFREE", "SEEKFREE123"); +// 备注信息 wifi_spi_init("SEEKFREE", NULL); // 连接没有密码的WIFI热点 //------------------------------------------------------------------------------------------------------------------- -uint8 wifi_spi_init (char *wifi_ssid, char *pass_word, wifi_spi_mode_enum wifi_mode) +uint8 wifi_spi_init (char *wifi_ssid, char *pass_word) { uint8 return_state = 0; - uint32 temp_isr; - - spi_init(WIFI_SPI_INDEX, SPI_MODE0, WIFI_SPI_SPEED, WIFI_SPI_SCK_PIN, WIFI_SPI_MOSI_PIN, WIFI_SPI_MISO_PIN, SPI_CS_NULL);//硬件SPI初始化 - set_wireless_type(WIFI_SPI, wifi_spi_callback); - fifo_init(&wifi_spi_fifo, FIFO_DATA_8BIT, wifi_spi_buffer, WIFI_SPI_BUFFER_SIZE); + fifo_init(&wifi_spi_fifo, FIFO_DATA_8BIT, wifi_spi_buffer, WIFI_SPI_RECVIVE_FIFO_SIZE); + spi_init(WIFI_SPI_INDEX, SPI_MODE3, WIFI_SPI_SPEED, WIFI_SPI_SCK_PIN, WIFI_SPI_MOSI_PIN, WIFI_SPI_MISO_PIN, SPI_CS_NULL);//硬件SPI初始化 gpio_init(WIFI_SPI_CS_PIN, GPO, 1, GPO_PUSH_PULL); gpio_init(WIFI_SPI_RST_PIN, GPO, 1, GPO_PUSH_PULL); - - temp_isr = interrupt_global_disable(); - - exti_init(WIFI_SPI_INT_PIN, EXTI_TRIGGER_RISING); - + gpio_init(WIFI_SPI_INT_PIN, GPI, 0, GPI_PULL_DOWN); + + // 复位 gpio_set_level(WIFI_SPI_RST_PIN, 0); - system_delay_ms(50); + system_delay_ms(10); gpio_set_level(WIFI_SPI_RST_PIN, 1); - system_delay_ms(1000); + + // 等待模块初始化 + system_delay_ms(100); + wifi_spi_mutex = WIFI_SPI_IDLE; - exti_flag_clear(WIFI_SPI_INT_PIN); - - interrupt_global_enable(temp_isr); do { - if(wifi_spi_echo_set("0")) // 关闭模块回写 + // 固件版本信息以字符串形式保存在wifi_spi_version数组中 + return_state = wifi_spi_get_version(); + if(return_state) + { + break; + } + + // MAC地址信息以字符串形式保存在wifi_spi_mac_addr数组中 + wifi_spi_get_mac_addr(); + + + return_state = wifi_spi_wifi_connect(wifi_ssid, pass_word); + if(return_state) { - zf_log(0, "exit echo failed"); - return_state = 1; break; } - if(wifi_spi_auto_connect_wifi("0")) // 关闭自动连接 + #if(1 == WIFI_SPI_AUTO_CONNECT) + return_state = wifi_spi_socket_connect("TCP", WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT); + if(return_state) { - zf_log(0, "close auto connect failed"); - return_state = 1; break; } - - if(wifi_spi_set_model(wifi_mode)) // 设置运行模式 + #endif + + #if(2 == WIFI_SPI_AUTO_CONNECT) + return_state = wifi_spi_socket_connect("UDP", WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT); + if(return_state) { - zf_log(0, "set run mode failed"); - return_state = 1; break; } - - if(wifi_spi_close_sleep_model()) // 关闭睡眠模式 - { - zf_log(0, "set sleep mode failed"); - return_state = 1; - break; - } - - if(wifi_spi_set_wifi((char *)wifi_ssid, (char *)pass_word)) // 连接 wifi 或者开启热点 - { - zf_log(0, "wifi set failed"); - return_state = 1; - break; - } - - if(wifi_spi_get_information()) // 模块基本参数获取 - { - zf_log(0, "get module information failed"); - return_state = 1; - break; - } -#if WIFI_SPI_AUTO_CONNECT == 1 - if(wifi_spi_connect_tcp_servers(WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_SERIANET)) // 连接TCP服务器 - { - zf_log(0, "connect TCP server failed"); - return_state = 1; - break; - } -#endif -#if WIFI_SPI_AUTO_CONNECT == 2 - if(wifi_spi_connect_udp_client(WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT, WIFI_SPI_SERIANET)) // 建立UDP连接 - { - zf_log(0, "connect UDP server failed"); - return_state = 1; - break; - } -#endif - // 模块初始化成功 - wifi_spi_init_flag = 1; + #endif }while(0); - + return return_state; } diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_wifi_spi.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_wifi_spi.h index 5e5a025..24e7eb1 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_wifi_spi.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_wifi_spi.h @@ -24,13 +24,13 @@ * 文件名称 zf_device_wifi_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 * 日期 作者 备注 -* 2023-05-27 pudding first version +* 2024-01-18 SeekFree first version ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,128 +53,100 @@ #include "zf_common_typedef.h" + #define WIFI_SPI_INDEX (SPI_3 ) // 定义使用的SPI号 -#define WIFI_SPI_SPEED (30 * 1000 * 1000 ) // 硬件 SPI 速率 +#define WIFI_SPI_SPEED (50 * 1000 * 1000 ) // 硬件 SPI 速率 #define WIFI_SPI_SCK_PIN (SPI3_SCLK_P22_3 ) // 定义SPI_SCK引脚 #define WIFI_SPI_MOSI_PIN (SPI3_MOSI_P22_0 ) // 定义SPI_MOSI引脚 #define WIFI_SPI_MISO_PIN (SPI3_MISO_P22_1 ) // 定义SPI_MISO引脚 IPS没有MISO引脚,但是这里任然需要定义,在spi的初始化时需要使用 #define WIFI_SPI_CS_PIN (P22_2 ) // 定义SPI_CS引脚 采用软件CS引脚 -#define WIFI_SPI_INT_PIN (ERU_CH5_REQ1_P15_8) // 定义中断引脚 +#define WIFI_SPI_INT_PIN (P15_8 ) // 定义握手引脚 #define WIFI_SPI_RST_PIN (P23_1 ) // 定义复位引脚 - - -#define WIFI_SPI_BUFFER_SIZE (1024) // 定义SPI接收的缓冲区大小 -#define WIFI_SPI_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不连接 1-自动连接TCP服务器并进入透传模式 2-自动连接UDP服务器并进入透传模式 3:自动建立TCP服务器 - -#if (WIFI_SPI_AUTO_CONNECT > 2) + +#define WIFI_SPI_RECVIVE_FIFO_SIZE (1024) // 接收FIFO大小 +#define WIFI_SPI_READ_TRANSFER (1) // 在调用wifi_spi_read_buffer 是否尝试发起SPI通讯来检测模块内是否有数据需要读取 1:发起SPI通讯 0:不发起SPI通讯,仅读取FIFO + // 如果应用程序中没有任何的地方调用发送函数,则WIFI_SPI_READ_TRANSFER必须设置为1 + +#define WIFI_SPI_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不自动连接 1-自动连接TCP服务器 2-自动连接UDP + +#if (WIFI_SPI_AUTO_CONNECT > 2) #error "WIFI_SPI_AUTO_CONNECT 的值只能为 [0,1,2]" #else -#define WIFI_SPI_TARGET_IP "192.168.2.28" // 连接目标的 IP +#define WIFI_SPI_TARGET_IP "192.168.137.1" // 连接目标的 IP #define WIFI_SPI_TARGET_PORT "8080" // 连接目标的端口 -#define WIFI_SPI_LOCAL_PORT "8080" // 本机端口 +#define WIFI_SPI_LOCAL_PORT "6666" // 本机的端口 0:随机 可设置范围2048-65535 默认 6666 #endif -#define WIFI_SPI_MAX_MULTI (17) // 多地址发送,最大8个地址 -typedef enum -{ - BUFFER_IDLE, // 模块的缓冲区是空闲的 - BUFFER_READ, // 模块的缓冲区有数据需要读取 - BUFFER_WRITE, // 模块的缓冲区是可写的 -}wifi_spi_buffer_state_enum; +#define WIFI_SPI_RECVIVE_SIZE (32) // 每次SPI传输接收的字节数 不允许修改 +#define WIFI_SPI_TRANSFER_SIZE (4088) // 最大SPI传输接收的字节数 不允许修改 + + typedef enum -{ - TRANSMIT_IDLE, // 当前没有传输 - TRANSMIT_WRITE_REQUEST, // 给模块发送了一个传输请求 - TRANSMIT_READ_STATE, // 读取模块状态 - TRANSMIT_READ, // 正在读取模块内部数据 - TRANSMIT_WRITE, // 正在往模块写入数据 -}wifi_spi_transmit_state_enum; - -typedef enum -{ - WIFI_SPI_STATION, // 设备模式 - WIFI_SPI_SOFTAP, // AP模式 -}wifi_spi_mode_enum; - -typedef enum -{ - WIFI_SPI_COMMAND, // 使用命令的方式发送数据 - WIFI_SPI_SERIANET, // 使用透传的方式发送数据 -}wifi_spi_transfer_mode_enum; - -typedef enum -{ - WIFI_SPI_TCP_CLIENT, // 模块连接TCP服务器 - WIFI_SPI_TCP_SERVER, // 模块作为TCP服务器 - WIFI_SPI_UDP_CLIENT, // 模块启用UDP连接 -}wifi_spi_connect_mode_enum; - -typedef enum -{ - WIFI_SPI_SERVER_OFF, // 模块未连接服务器 - WIFI_SPI_SERVER_ON, // 模块已经连接服务器 -}wifi_spi_connect_state_enum; - -typedef enum -{ - WIFI_SPI_LINK_0, // 模块当前链接 0 - WIFI_SPI_LINK_1, // 模块当前链接 1 - WIFI_SPI_LINK_2, // 模块当前链接 2 - WIFI_SPI_LINK_3, // 模块当前链接 3 - WIFI_SPI_LINK_4, // 模块当前链接 4 -}wifi_spi_link_id_enum; - -typedef struct { - uint8 reserve; - uint8 cmd; - uint8 addr; - uint8 dummy; - uint8 magic; - uint8 sequence; - uint16 length; -}wifi_spi_buffer_struct; + // 主机发送的命令 + WIFI_SPI_INVALID1 = 0x00, // 无效数据包 + WIFI_SPI_RESET = 0x01, // 复位命令 + WIFI_SPI_DATA = 0x02, // 透传数据包 + WIFI_SPI_UDP_SEND = 0x03, // UDP下立即发送命令,默认SPI接收数据后2MS未收到数据自动发送数据 + WIFI_SPI_CLOSE_SOCKET = 0x04, // 断开连接 + + WIFI_SPI_SET_WIFI_INFORMATION = 0x10, // 设置WIFI信息命令 + WIFI_SPI_SET_SOCKET_INFORMATION = 0x11, // 设置SOCKET信息命令 + + WIFI_SPI_GET_VERSION = 0x20, // 获取模块版本 + WIFI_SPI_GET_MAC_ADDR = 0x21, // 获取模块MAC地址 + WIFI_SPI_GET_IP_ADDR = 0x22, // 获取模块IP地址 + + // 从机回传的命令 + WIFI_SPI_REPLY_OK = 0x80, // 从机应答的正确命令 + WIFI_SPI_REPLY_ERROR = 0x81, // 从机应答的错误命令 + + WIFI_SPI_REPLY_DATA_START = 0x90, // 从机回传的数据包,并且还有数据需要主机读取 + WIFI_SPI_REPLY_DATA_END = 0x91, // 从机回传的数据包,数据已读取完毕 + + WIFI_SPI_REPLY_VERSION = 0xA0, // 从机回复固件版本 + WIFI_SPI_REPLY_MAC_ADDR = 0xA1, // 从机回复本机MAC地址等信息 + WIFI_SPI_REPLY_IP_ADDR = 0xA2, // 从机回复本机IP地址、端口号 + WIFI_SPI_INVALID2 = 0xFF // 无效数据包 +}wifi_spi_packets_command_enum; + +typedef enum +{ + WIFI_SPI_IDLE, // 模块空闲,可以进行SPI通讯 + WIFI_SPI_BUSY, // 模块正忙,不可进行SPI通讯 +}wifi_spi_state_enum; + + +typedef struct +{ + uint8 command; // 命令字 + uint8 reserve; // 保留 + uint16 length; // 包有效长度 +}wifi_spi_head_struct; + + +typedef struct +{ + wifi_spi_head_struct head; // 帧头 + uint8 buffer[WIFI_SPI_RECVIVE_SIZE]; // 缓冲区 +}wifi_spi_packets_struct; + + +extern char wifi_spi_version[12]; // 固件版本 字符串 +extern char wifi_spi_mac_addr[20]; // 模块MAC地址 字符串 +extern char wifi_spi_ip_addr_port[25]; // IP地址与端口号 字符串 -typedef struct -{ - uint8 version[12]; // 固件版本 字符串形式 - uint8 mac[20]; // 本机 MAC 地址 字符串形式 - uint8 local_ip[17]; // 本机 IP 地址 字符串形式 - uint8 local_port[10]; // 本机端口号 字符串形式 - uint8 remote_ip[5][17]; // 远端 IP 地址 字符串形式 - wifi_spi_mode_enum mode; // WIFI 模式 - wifi_spi_transfer_mode_enum transfer_mode; // 当前传输模式 - wifi_spi_connect_mode_enum connect_mode; // 网络连接模式 - wifi_spi_connect_state_enum connect_state; // 服务器连接情况 -}wifi_spi_information_struct; +uint8 wifi_spi_wifi_connect (char *wifi_ssid, char *pass_word); +uint8 wifi_spi_socket_connect (char *transport_type, char *ip_addr, char *port, char *local_port); +uint8 wifi_spi_socket_disconnect (void); +uint8 wifi_spi_udp_send_now (void); +uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 length); +uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 length); -typedef struct -{ - uint8 *source[WIFI_SPI_MAX_MULTI]; - uint16 length[WIFI_SPI_MAX_MULTI]; -}wifi_spi_send_multi_struct; - -extern wifi_spi_information_struct wifi_spi_information; - - -uint8 wifi_spi_disconnected_wifi (void); // 断开 WIFI 连接 -uint8 wifi_spi_entry_serianet (void); // 打开透传模式 -uint8 wifi_spi_exit_serianet (void); // 关闭透传模式 - -uint8 wifi_spi_connect_tcp_servers (char *ip, char *port, wifi_spi_transfer_mode_enum mode); // 建立 TCP 连接 -uint8 wifi_spi_connect_udp_client (char *ip, char *port, char *local_port, wifi_spi_transfer_mode_enum mode); // 建立 UDP 传输 -uint8 wifi_spi_disconnect_link (void); // 断开连接 TCP Server 使用本接口将会断开所有连接 - -uint32 wifi_spi_send_byte (uint8 data); // WIFI 模块发送字节函数 -uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 length); // WIFI 模块发送缓冲区函数 -uint32 wifi_spi_send_buffer_multi (wifi_spi_send_multi_struct *multi_buffer); // WIFI 模块发送多缓冲区函数 -uint32 wifi_spi_send_string (const char *str); // WIFI 模块发送字符串函数 - -uint32 wifi_spi_read_buffer (uint8 *buff, uint32 len); // WIFI 模块数据接收函数 - -uint8 wifi_spi_init (char *wifi_ssid, char *pass_word, wifi_spi_mode_enum wifi_mode); // WIFI 模块初始化函数 +uint8 wifi_spi_init (char *wifi_ssid, char *pass_word); #endif + diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_wifi_uart.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_wifi_uart.c index 312dab7..ff728bb 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_wifi_uart.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_wifi_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_wifi_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -61,7 +61,7 @@ wifi_uart_information_struct wifi_uart_information; // 模块自身参数 -static fifo_obj_struct wifi_uart_fifo; +static fifo_struct wifi_uart_fifo; static uint8 wifi_uart_buffer[WIFI_UART_BUFFER_SIZE]; // 数据存放数组 static uint8 wifi_uart_data; diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_wifi_uart.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_wifi_uart.h index abcb253..3316b6f 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_wifi_uart.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_wifi_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_wifi_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_wireless_uart.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_wireless_uart.c index eac2867..91ec013 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_wireless_uart.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_wireless_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_wireless_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -53,7 +53,7 @@ #include "zf_device_type.h" #include "zf_device_wireless_uart.h" -static fifo_obj_struct wireless_uart_fifo; +static fifo_struct wireless_uart_fifo; static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; static uint8 wireless_uart_data = 0; diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_wireless_uart.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_wireless_uart.h index 2418545..a789ad0 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_wireless_uart.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_wireless_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_wireless_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -61,11 +61,11 @@ // 注意事项2:开启自动波特率务必连接RTS引脚 否则会开启失败。 // 注意事项3:模块自动波特率失败的话 可以尝试断电重启 -// 开启自动波特率务必阅读上面两条 注意事项 -// 开启自动波特率务必阅读上面两条 注意事项 -// 开启自动波特率务必阅读上面两条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 -// 0:关闭自动波特率 +// 0:关闭自动波特率 // 1:开启自动波特率 自动波特率的作用是修改 WIRELESS_UART_BAUD 之后不需要对模块进行配置 模块会自动设置为对应的波特率 #define WIRELESS_UART_AUTO_BAUD_RATE ( 1 ) diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_adc.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_adc.c index 9a262a1..06694d8 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_adc.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_adc.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_adc * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_adc.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_adc.h index 378b67e..f017c76 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_adc.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_adc.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_adc * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_delay.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_delay.c index 4ec533c..ae3e610 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_delay.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_delay.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_delay * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_delay.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_delay.h index e8d82ef..7b8b475 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_delay.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_delay.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_delay * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_dma.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_dma.c index f72f1d6..43bffbc 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_dma.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_dma.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_dma * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_dma.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_dma.h index 1ec555b..320d40c 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_dma.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_dma.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_dma * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_encoder.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_encoder.c index 6592198..0e0e0b9 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_encoder.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_encoder.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_encoder.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_encoder.h index 68d159f..e079122 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_encoder.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_encoder.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_exti.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_exti.c index 72c9a1f..31d270a 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_exti.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_exti.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_exti * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_exti.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_exti.h index 30f5ef6..b63f9ee 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_exti.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_exti.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_exti * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_flash.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_flash.c index f91f5a0..325cfed 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_flash.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_flash.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_flash * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_flash.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_flash.h index 912585a..e7425fd 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_flash.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_flash.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_flash * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_gpio.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_gpio.c index 5071114..a084353 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_gpio.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_gpio.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_gpio * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_gpio.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_gpio.h index 2b23be0..550fb8d 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_gpio.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_gpio.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_gpio * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_pit.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_pit.c index c4dc50d..5e03d38 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_pit.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_pit.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pit * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_pit.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_pit.h index 5461e05..66854b5 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_pit.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_pit.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pit * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_pwm.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_pwm.c index ad1059a..24d8d7a 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_pwm.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_pwm.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pwm * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_pwm.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_pwm.h index d6dce78..51948a4 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_pwm.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_pwm.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pwm * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_soft_iic.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_soft_iic.c index 9833b62..a349ec7 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_soft_iic.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_soft_iic.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_iic * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_soft_iic.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_soft_iic.h index a62b262..80db53b 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_soft_iic.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_soft_iic.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_iic * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_soft_spi.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_soft_spi.c index 292c60b..954fbe3 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_soft_spi.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_soft_spi.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_soft_spi.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_soft_spi.h index 6a9c207..62858de 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_soft_spi.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_soft_spi.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_spi.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_spi.c index 1b99196..f817dd9 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_spi.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_spi.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -920,7 +920,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 do { - IfxQspi_writeTransmitFifo(moudle, (uint8)(*write_buffer & 0xFF00) >> 8); // 将发送的数据写入缓冲区 + IfxQspi_writeTransmitFifo(moudle, (uint8)((*write_buffer & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 if(read_buffer != NULL) { diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_spi.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_spi.h index e73507e..d15589c 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_spi.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_spi.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_timer.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_timer.c index a953b92..e085d6e 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_timer.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_timer.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_timer * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_timer.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_timer.h index 3c86f58..1bb348f 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_timer.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_timer.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_timer * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_uart.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_uart.c index cd19782..fb89b55 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_uart.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_uart.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_uart.h index 8d1d111..cdc55ab 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_uart.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E11_interrupt_priority_set_demo/user/isr.c b/Example/E11_interrupt_priority_set_demo/user/isr.c index 27171d2..9108ff0 100644 --- a/Example/E11_interrupt_priority_set_demo/user/isr.c +++ b/Example/E11_interrupt_priority_set_demo/user/isr.c @@ -24,7 +24,7 @@ * 文件名称 isr * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -118,7 +118,7 @@ IFX_INTERRUPT(exti_ch1_ch5_isr, 0, EXTI_CH1_CH5_INT_PRIO) { exti_flag_clear(ERU_CH5_REQ1_P15_8); - wireless_module_spi_handler(); // SPI WIFI 中断回调函数 + } } diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/doc/version.txt b/Example/E12_cpu1_handles_interrupts_demo/libraries/doc/version.txt index b841b50..d644136 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/doc/version.txt +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/doc/version.txt @@ -1,3 +1,8 @@ +V3.2.6 + 更新逐飞助手接口函数 调用初始化时直接传参通信类 + 更新wifi SPI驱动文件 提高通信效率 + 更新GPS驱动文件,更名为GNSS,兼容普通定位模块及RTK + V3.2.5 修复延时函数初始化参数及中断向量表问题 V3.2.4 diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h index 28ff689..371e6b6 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h @@ -34,7 +34,7 @@ /*------------------------------------------Configuration for IfxScu_cfg.h-------------------------------------------*/ /*********************************************************************************************************************/ /* External oscillator frequency in Hz */ -#define IFX_CFG_SCU_XTAL_FREQUENCY (20000000) /* Allowed values are: 16000000, 20000000 or 40000000 */ +#define IFX_CFG_SCU_XTAL_FREQUENCY (20000000) /* Allowed values are9p: 16000000, 20000000 or 40000000 */ /* PLL frequency in Hz */ #define IFX_CFG_SCU_PLL_FREQUENCY (200000000) /* Allowed values are: 80000000, 133000000, 160000000 * or 200000000 */ diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_clock.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_clock.c index 5023270..9872ea9 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_clock.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_clock.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_clock * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_clock.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_clock.h index 9face65..2b50396 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_clock.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_clock.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_clock * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_debug.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_debug.c index 52c623d..d680265 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_debug.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_debug.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_debug * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -46,7 +46,7 @@ static volatile uint8 zf_debug_assert_enable = 1; #if DEBUG_UART_USE_INTERRUPT // 如果启用 debug uart 接收中断 uint8 debug_uart_buffer[DEBUG_RING_BUFFER_LEN]; // 数据存放数组 uint8 debug_uart_data; -fifo_obj_struct debug_uart_fifo; +fifo_struct debug_uart_fifo; #endif //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_debug.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_debug.h index 881a297..4fb4d91 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_debug.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_debug.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_debug * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_fifo.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_fifo.c index b010d3e..94f5133 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_fifo.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_fifo.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_fifo * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -45,7 +45,7 @@ // 使用示例 fifo_head_offset(fifo, 1); // 备注信息 本函数在文件内部调用 用户不用关注 也不可修改 //------------------------------------------------------------------------------------------------------------------- -static void fifo_head_offset (fifo_obj_struct *fifo, uint32 offset) +static void fifo_head_offset (fifo_struct *fifo, uint32 offset) { fifo->head += offset; @@ -63,7 +63,7 @@ static void fifo_head_offset (fifo_obj_struct *fifo, uint32 offset) // 使用示例 fifo_end_offset(fifo, 1); // 备注信息 本函数在文件内部调用 用户不用关注 也不可修改 //------------------------------------------------------------------------------------------------------------------- -static void fifo_end_offset (fifo_obj_struct *fifo, uint32 offset) +static void fifo_end_offset (fifo_struct *fifo, uint32 offset) { fifo->end += offset; @@ -80,7 +80,7 @@ static void fifo_end_offset (fifo_obj_struct *fifo, uint32 offset) // 使用示例 fifo_clear(fifo); // 备注信息 清空当前 FIFO 对象的内存 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_clear (fifo_obj_struct *fifo) +fifo_state_enum fifo_clear (fifo_struct *fifo) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -113,7 +113,7 @@ fifo_state_enum fifo_clear (fifo_obj_struct *fifo) // 使用示例 uint32 len = fifo_used(fifo); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 fifo_used (fifo_obj_struct *fifo) +uint32 fifo_used (fifo_struct *fifo) { zf_assert(fifo != NULL); return (fifo->max - fifo->size); // 返回当前 FIFO 缓冲区中数据个数 @@ -127,7 +127,7 @@ uint32 fifo_used (fifo_obj_struct *fifo) // 使用示例 zf_log(fifo_write_element(&fifo, data) == FIFO_SUCCESS, "fifo_write_byte error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat) +fifo_state_enum fifo_write_element (fifo_struct *fifo, uint32 dat) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -171,7 +171,7 @@ fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat) // 使用示例 zf_log(fifo_write_buffer(&fifo, data, 32) == FIFO_SUCCESS, "fifo_write_buffer error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 length) +fifo_state_enum fifo_write_buffer (fifo_struct *fifo, void *dat, uint32 length) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -286,7 +286,7 @@ fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 leng // 使用示例 zf_log(fifo_read_element(&fifo, data, FIFO_READ_ONLY) == FIFO_SUCCESS, "fifo_read_byte error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operation_enum flag) +fifo_state_enum fifo_read_element (fifo_struct *fifo, void *dat, fifo_operation_enum flag) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -348,7 +348,7 @@ fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operat // 使用示例 zf_log(fifo_read_buffer(&fifo, data, &length, FIFO_READ_ONLY) == FIFO_SUCCESS, "fifo_read_buffer error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) +fifo_state_enum fifo_read_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) { zf_assert(NULL != fifo); zf_assert(NULL != length); @@ -447,7 +447,7 @@ fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *leng // 如果使用 FIFO_READ_AND_CLEAN 操作 将会丢弃所有数据并清空整个 FIFO // 如果使用 FIFO_READ_AND_CLEAN 操作 将会丢弃所有数据并清空整个 FIFO //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) +fifo_state_enum fifo_read_tail_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) { zf_assert(NULL != fifo); zf_assert(NULL != length); @@ -541,7 +541,7 @@ fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 // 使用示例 fifo_init(&user_fifo, user_buffer, 64); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_init (fifo_obj_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size) +fifo_state_enum fifo_init (fifo_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_fifo.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_fifo.h index 5cc7668..901a913 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_fifo.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_fifo.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_fifo * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -91,17 +91,17 @@ typedef struct uint32 end; // 缓存尾指针 总是指向非空缓存(缓存全空除外) uint32 size; // 缓存剩余大小 uint32 max; // 缓存总大小 -}fifo_obj_struct; +}fifo_struct; -fifo_state_enum fifo_clear (fifo_obj_struct *fifo); -uint32 fifo_used (fifo_obj_struct *fifo); +fifo_state_enum fifo_clear (fifo_struct *fifo); +uint32 fifo_used (fifo_struct *fifo); -fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat); -fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 length); -fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operation_enum flag); -fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); -fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); +fifo_state_enum fifo_write_element (fifo_struct *fifo, uint32 dat); +fifo_state_enum fifo_write_buffer (fifo_struct *fifo, void *dat, uint32 length); +fifo_state_enum fifo_read_element (fifo_struct *fifo, void *dat, fifo_operation_enum flag); +fifo_state_enum fifo_read_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); +fifo_state_enum fifo_read_tail_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); -fifo_state_enum fifo_init (fifo_obj_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size); +fifo_state_enum fifo_init (fifo_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size); #endif diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_font.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_font.c index c816f9d..ee1df09 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_font.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_font.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_font * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_font.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_font.h index 24b8602..7531250 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_font.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_font.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_font * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_function.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_function.c index d403fb5..acf2739 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_function.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_function.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_function * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_function.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_function.h index f5683e1..101b58a 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_function.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_function.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_function * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_headfile.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_headfile.h index aa06ef8..86762db 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_headfile.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_headfile.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_headfile * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -82,7 +82,7 @@ //===================================================外接设备驱动层=================================================== #include "zf_device_absolute_encoder.h" #include "zf_device_bluetooth_ch9141.h" -#include "zf_device_gps_tau1201.h" +#include "zf_device_gnss.h" #include "zf_device_camera.h" #include "zf_device_dl1a.h" #include "zf_device_dl1b.h" @@ -108,6 +108,7 @@ //====================================================应用组件层==================================================== #include "seekfree_assistant.h" +#include "seekfree_assistant_interface.h" //====================================================应用组件层==================================================== //=====================================================用户层====================================================== diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_interrupt.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_interrupt.c index 61058b2..af12fe0 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_interrupt.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_interrupt.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_interrupt * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_interrupt.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_interrupt.h index 99b0e53..f828423 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_interrupt.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_interrupt.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_interrupt * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_typedef.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_typedef.h index bd09f30..9a07c92 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_typedef.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_typedef.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_typedef * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_components/seekfree_assistant.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_components/seekfree_assistant.c index a196e10..0b7cb9d 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_components/seekfree_assistant.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_components/seekfree_assistant.c @@ -1,49 +1,71 @@ /********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ -#include "zf_common_fifo.h" + +#include "zf_common_debug.h" + #include "seekfree_assistant.h" -seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 -static seekfree_assistant_camera_struct seekfree_assistant_camera_data; // 图像上位机协议数据 -static seekfree_assistant_camera_dot_struct seekfree_assistant_camera_dot_data; // 图像上位机打点协议数据 -static seekfree_assistant_camera_buffer_struct seekfree_assistant_camera_buffer; // 图像以及边界缓冲区信息 -static fifo_obj_struct seekfree_assistant_fifo; -static uint8 seekfree_assistant_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE]; // 数据存放数组 -float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 保存接收到的参数 -vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 参数更新标志位 +extern uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length); +extern uint32 seekfree_assistant_receive (uint8 *buff, uint32 length); + +#if (1 == SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE) +#include "zf_common_fifo.h" +static uint8 seekfree_assistant_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE]; // FIFO缓冲区 +static fifo_struct seekfree_assistant_fifo = // FIFO结构体 +{ + .buffer = seekfree_assistant_buffer, + .execution = FIFO_IDLE, + .type = FIFO_DATA_8BIT, + .head = 0, + .end = 0, + .size = SEEKFREE_ASSISTANT_BUFFER_SIZE, + .max = SEEKFREE_ASSISTANT_BUFFER_SIZE, +}; +#endif + +static seekfree_assistant_camera_struct seekfree_assistant_camera_data; // 图像上位机协议数据 +static seekfree_assistant_camera_dot_struct seekfree_assistant_camera_dot_data; // 图像上位机打点协议数据 +static seekfree_assistant_camera_buffer_struct seekfree_assistant_camera_buffer; // 图像以及边界缓冲区信息 + +seekfree_assistant_transfer_callback_function seekfree_assistant_transfer_callback = seekfree_assistant_transfer; // 数据发送函数指针 +seekfree_assistant_receive_callback_function seekfree_assistant_receive_callback = seekfree_assistant_receive; // 数据接收函数指针 + +seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 +float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 保存接收到的参数 +vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 参数更新标志位 //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手求和函数 @@ -87,7 +109,7 @@ void seekfree_assistant_camera_data_send (seekfree_assistant_image_type_enum cam seekfree_assistant_camera_data.image_height = height; // 首先发送帧头、功能、摄像头类型、以及宽度高度等信息 - seekfree_assistant_transfer((const uint8 *)&seekfree_assistant_camera_data, sizeof(seekfree_assistant_camera_struct)); + seekfree_assistant_transfer_callback((const uint8 *)&seekfree_assistant_camera_data, sizeof(seekfree_assistant_camera_struct)); // 根据摄像头类型计算图像大小 switch(camera_type) @@ -111,9 +133,8 @@ void seekfree_assistant_camera_data_send (seekfree_assistant_image_type_enum cam // 发送图像数据 if(NULL != image_addr) { - seekfree_assistant_transfer(image_addr, image_size); + seekfree_assistant_transfer_callback(image_addr, image_size); } - } //------------------------------------------------------------------------------------------------------------------- @@ -139,16 +160,15 @@ void seekfree_assistant_camera_dot_send (seekfree_assistant_camera_buffer_struct dot_bytes *= 2; } - // 首先发送帧头、功能、边界编号、坐标长度、点个数 - seekfree_assistant_transfer((const uint8 *)&seekfree_assistant_camera_dot_data, sizeof(seekfree_assistant_camera_dot_struct)); + seekfree_assistant_transfer_callback((const uint8 *)&seekfree_assistant_camera_dot_data, sizeof(seekfree_assistant_camera_dot_struct)); for(i=0; i < SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY; i++) { // 判断是否发送横坐标数据 if(NULL != buffer->boundary_x[i]) { - seekfree_assistant_transfer((const uint8 *)buffer->boundary_x[i], dot_bytes); + seekfree_assistant_transfer_callback((const uint8 *)buffer->boundary_x[i], dot_bytes); } // 判断是否发送纵坐标数据 @@ -156,10 +176,9 @@ void seekfree_assistant_camera_dot_send (seekfree_assistant_camera_buffer_struct { // 如果没有纵坐标数据,则表示每一行只有一个边界 // 指定了横纵坐标数据,这种方式可以实现同一行多个边界的情况,例如搜线算法能够搜索出回弯。 - seekfree_assistant_transfer((const uint8 *)buffer->boundary_y[i], dot_bytes); + seekfree_assistant_transfer_callback((const uint8 *)buffer->boundary_y[i], dot_bytes); } } - } //------------------------------------------------------------------------------------------------------------------- @@ -193,7 +212,7 @@ void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struc // 数据在调用本函数之前,由用户将需要发送的数据写入seekfree_assistant_oscilloscope_data.data[] - seekfree_assistant_transfer((const uint8 *)seekfree_assistant_oscilloscope, packet_size); + seekfree_assistant_transfer_callback((const uint8 *)seekfree_assistant_oscilloscope, packet_size); } //------------------------------------------------------------------------------------------------------------------- @@ -364,12 +383,14 @@ void seekfree_assistant_camera_send (void) } } + //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手解析接收到的数据 // 参数说明 void // 返回参数 void // 使用示例 函数只需要放到周期运行的PIT中断或者主循环即可 //------------------------------------------------------------------------------------------------------------------- +#if (1 == SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE) void seekfree_assistant_data_analysis (void) { uint8 temp_sum; @@ -380,14 +401,13 @@ void seekfree_assistant_data_analysis (void) uint32 temp_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE / 4]; // 尝试读取数据, 如果不是自定义的传输方式则从接收回调中读取数据 - read_length = seekfree_assistant_receive((uint8 *)temp_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); + read_length = seekfree_assistant_receive_callback((uint8 *)temp_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); if(read_length) { // 将读取到的数据写入FIFO fifo_write_buffer(&seekfree_assistant_fifo, (uint8 *)temp_buffer, read_length); } - while(sizeof(seekfree_assistant_parameter_struct) <= fifo_used(&seekfree_assistant_fifo)) { read_length = sizeof(seekfree_assistant_parameter_struct); @@ -416,21 +436,11 @@ void seekfree_assistant_data_analysis (void) } } - // 丢弃无需使用的数据 fifo_read_buffer(&seekfree_assistant_fifo, (uint8 *)temp_buffer, &read_length, FIFO_READ_AND_CLEAN); } } - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 逐飞助手 初始化 -// 参数说明 -// 返回参数 void -// 使用示例 -//------------------------------------------------------------------------------------------------------------------- -ZF_WEAK void seekfree_assistant_init () -{ - fifo_init(&seekfree_assistant_fifo, FIFO_DATA_8BIT, seekfree_assistant_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); -} +#endif + diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_components/seekfree_assistant.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_components/seekfree_assistant.h index d02abb1..ae0f67c 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_components/seekfree_assistant.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_components/seekfree_assistant.h @@ -1,69 +1,75 @@ -/*/********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +/********************************************************************************************************************* +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ #ifndef _seekfree_assistant_h_ #define _seekfree_assistant_h_ #include "zf_common_typedef.h" -#include "zf_common_debug.h" + + +// 1:使能参数调节的功能 0:关闭参数调节的功能 +#define SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE ( 1 ) + + // 定义接收FIFO大小 -#define SEEKFREE_ASSISTANT_BUFFER_SIZE ( 0x80 ) +#define SEEKFREE_ASSISTANT_BUFFER_SIZE ( 0x80 ) + +// 定义示波器的最大通道数量 +#define SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT ( 0x08 ) + +// 定义参数调试的最大通道数量 +#define SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT ( 0x08 ) + +// 定义图像边线最大数量 +#define SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY ( 0x08 ) + +// 单片机往上位机发送的帧头 +#define SEEKFREE_ASSISTANT_SEND_HEAD ( 0xAA ) + +// 摄像头类 +#define SEEKFREE_ASSISTANT_CAMERA_FUNCTION ( 0x02 ) +#define SEEKFREE_ASSISTANT_CAMERA_DOT_FUNCTION ( 0x03 ) +#define SEEKFREE_ASSISTANT_CAMERA_OSCILLOSCOPE ( 0x10 ) + +// 上位机往单片机发送的帧头 +#define SEEKFREE_ASSISTANT_RECEIVE_HEAD ( 0x55 ) + +// 参数设置类 +#define SEEKFREE_ASSISTANT_RECEIVE_SET_PARAMETER ( 0x20 ) -// 定义示波器的最大通道数量 -#define SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT ( 0x08 ) - -// 定义参数调试的最大通道数量 -#define SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT ( 0x08 ) - -// 定义图像边线最大数量 -#define SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY ( 0x08 ) - -// 单片机往上位机发送的帧头 -#define SEEKFREE_ASSISTANT_SEND_HEAD ( 0xAA ) - -// 摄像头类 -#define SEEKFREE_ASSISTANT_CAMERA_FUNCTION ( 0x02 ) -#define SEEKFREE_ASSISTANT_CAMERA_DOT_FUNCTION ( 0x03 ) -#define SEEKFREE_ASSISTANT_CAMERA_OSCILLOSCOPE ( 0x10 ) - -// 上位机往单片机发送的帧头 -#define SEEKFREE_ASSISTANT_RECEIVE_HEAD ( 0x55 ) - -// 参数设置类 -#define SEEKFREE_ASSISTANT_RECEIVE_SET_PARAMETER ( 0x20 ) // 摄像头类型枚举 typedef enum @@ -91,71 +97,69 @@ typedef enum typedef struct { - uint8 head; // 帧头 - uint8 channel_num; // 高四位为功能字 低四位为通道数量 - uint8 check_sum; // 和校验 - uint8 length; // 包长度 - float data[SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT]; // 通道数据 + uint8 head; // 帧头 + uint8 channel_num; // 高四位为功能字 低四位为通道数量 + uint8 check_sum; // 和校验 + uint8 length; // 包长度 + float data[SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT]; // 通道数据 }seekfree_assistant_oscilloscope_struct; typedef struct { - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 camera_type; // 低四位表示边界数量 第四位表示是否有图像数据 例如0x13:其中3表示一副图像有三条边界(通常是左边界、中线、右边界)、1表示没有图像数据 - uint8 length; // 包长度(仅包含协议部分) - uint16 image_width; // 图像宽度 - uint16 image_height; // 图像高度 -}seekfree_assistant_camera_struct; - - -typedef struct -{ - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 dot_type; // 点类型 BIT5:1:坐标是16位的 0:坐标是8位的 BIT7-BIT6:0:只有X坐标 1:只有Y坐标 2:X和Y坐标都有 BIT3-BIT0:边界数量 - uint8 length; // 包长度(仅包含协议部分) - uint16 dot_num; // 画点数量 - uint8 valid_flag; // 通道标识 - uint8 reserve; // 保留 -}seekfree_assistant_camera_dot_struct; - -typedef struct -{ - void *image_addr; // 摄像头地址 - uint16 width; // 图像宽度 - uint16 height; // 图像高度 - seekfree_assistant_image_type_enum camera_type; // 摄像头类型 - void *boundary_x[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界横坐标数组地址 - void *boundary_y[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界纵坐标数组地址 + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 camera_type; // 低四位表示边界数量 第四位表示是否有图像数据 例如0x13:其中3表示一副图像有三条边界(通常是左边界、中线、右边界)、1表示没有图像数据 + uint8 length; // 包长度(仅包含协议部分) + uint16 image_width; // 图像宽度 + uint16 image_height; // 图像高度 +}seekfree_assistant_camera_struct; + + +typedef struct +{ + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 dot_type; // 点类型 BIT5:1:坐标是16位的 0:坐标是8位的 BIT7-BIT6:0:只有X坐标 1:只有Y坐标 2:X和Y坐标都有 BIT3-BIT0:边界数量 + uint8 length; // 包长度(仅包含协议部分) + uint16 dot_num; // 画点数量 + uint8 valid_flag; // 通道标识 + uint8 reserve; // 保留 +}seekfree_assistant_camera_dot_struct; + +typedef struct +{ + void *image_addr; // 摄像头地址 + uint16 width; // 图像宽度 + uint16 height; // 图像高度 + seekfree_assistant_image_type_enum camera_type; // 摄像头类型 + void *boundary_x[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界横坐标数组地址 + void *boundary_y[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界纵坐标数组地址 }seekfree_assistant_camera_buffer_struct; typedef struct { - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 channel; // 通道 - uint8 check_sum; // 和校验 - float data; // 数据 + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 channel; // 通道 + uint8 check_sum; // 和校验 + float data; // 数据 }seekfree_assistant_parameter_struct; +typedef uint32 (*seekfree_assistant_transfer_callback_function) (const uint8 *buff, uint32 length); +typedef uint32 (*seekfree_assistant_receive_callback_function) (uint8 *buff, uint32 length); -extern seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 -extern float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 保存接收到的参数 -extern vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 参数更新标志位 +extern seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 +extern float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 保存接收到的参数 +extern vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 参数更新标志位 + + +void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struct *seekfree_assistant_oscilloscope); +void seekfree_assistant_camera_information_config (seekfree_assistant_image_type_enum camera_type, void *image_addr, uint16 width, uint16 height); +void seekfree_assistant_camera_boundary_config (seekfree_assistant_boundary_type_enum boundary_type, uint16 dot_num, void *dot_x1, void *dot_x2, void *dot_x3, void *dot_y1, void *dot_y2, void *dot_y3); +void seekfree_assistant_camera_send (void); +void seekfree_assistant_data_analysis (void); -uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length); -uint32 seekfree_assistant_receive (uint8 *buff, uint32 length); - -void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struct *seekfree_assistant_oscilloscope); - -void seekfree_assistant_camera_information_config (seekfree_assistant_image_type_enum camera_type, void *image_addr, uint16 width, uint16 height); -void seekfree_assistant_camera_boundary_config (seekfree_assistant_boundary_type_enum boundary_type, uint16 dot_num, void *dot_x1, void *dot_x2, void *dot_x3, void *dot_y1, void *dot_y2, void *dot_y3); -void seekfree_assistant_camera_send (void); - -void seekfree_assistant_data_analysis (void); -void seekfree_assistant_init (void); #endif diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_components/seekfree_assistant_interface.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_components/seekfree_assistant_interface.c index 99dbeef..fdade63 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_components/seekfree_assistant_interface.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_components/seekfree_assistant_interface.c @@ -1,42 +1,55 @@ /********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant_interface * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ #include "zf_common_typedef.h" +#include "zf_common_fifo.h" #include "zf_common_debug.h" +#include "zf_driver_uart.h" +#include "zf_device_wireless_uart.h" +#include "zf_device_bluetooth_ch9141.h" +#include "zf_device_wifi_uart.h" +#include "zf_device_wifi_spi.h" #include "seekfree_assistant.h" +#include "seekfree_assistant_interface.h" + + +extern seekfree_assistant_transfer_callback_function seekfree_assistant_transfer_callback; // 数据发送函数指针 +extern seekfree_assistant_receive_callback_function seekfree_assistant_receive_callback; // 数据接收函数指针 + + //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手发送函数 // 参数说明 *buff 需要发送的数据地址 @@ -46,11 +59,9 @@ //------------------------------------------------------------------------------------------------------------------- ZF_WEAK uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length) { - uint32 len = 0; - - len = debug_send_buffer(buff, length); - - return len; + + // 当选择自定义通讯方式时 需要自行完成数据发送功能 + return length; } //------------------------------------------------------------------------------------------------------------------- @@ -62,11 +73,57 @@ ZF_WEAK uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length) //------------------------------------------------------------------------------------------------------------------- ZF_WEAK uint32 seekfree_assistant_receive (uint8 *buff, uint32 length) { - uint32 len = 0; + // 当选择自定义通讯方式时 需要自行完成数据接收功能 + return 0; +} - len = debug_read_ring_buffer(buff, length); - - return len; +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 逐飞助手接口 初始化 +// 参数说明 +// 返回参数 void +// 使用示例 seekfree_assistant_interface_init(SEEKFREE_ASSISTANT_WIFI_SPI); 使用高速WIFI SPI模块进行数据收发 +// 备注 需要自行调用设备的初始化,例如使用无线转串口进行数据的收发,则需要自行调用无线转串口的初始化,然后再调用seekfree_assistant_interface_init完成逐飞助手的接口初始化 +//------------------------------------------------------------------------------------------------------------------- +ZF_WEAK void seekfree_assistant_interface_init (seekfree_assistant_transfer_device_enum transfer_device) +{ + switch(transfer_device) + { + case SEEKFREE_ASSISTANT_DEBUG_UART: + { + seekfree_assistant_transfer_callback = debug_send_buffer; + seekfree_assistant_receive_callback = debug_read_ring_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIRELESS_UART: + { + seekfree_assistant_transfer_callback = wireless_uart_send_buffer; + seekfree_assistant_receive_callback = wireless_uart_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_CH9141: + { + seekfree_assistant_transfer_callback = bluetooth_ch9141_send_buffer; + seekfree_assistant_receive_callback = bluetooth_ch9141_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIFI_UART: + { + seekfree_assistant_transfer_callback = wifi_uart_send_buffer; + seekfree_assistant_receive_callback = wifi_uart_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIFI_SPI: + { + seekfree_assistant_transfer_callback = wifi_spi_send_buffer; + seekfree_assistant_receive_callback = wifi_spi_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_CUSTOM: + { + // 根据自己的需求 自行实现seekfree_assistant_transfer与seekfree_assistant_receive函数,完成数据的收发 + + }break; + } } diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_components/seekfree_assistant_interface.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_components/seekfree_assistant_interface.h new file mode 100644 index 0000000..940b5f7 --- /dev/null +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_components/seekfree_assistant_interface.h @@ -0,0 +1,57 @@ +/********************************************************************************************************************* +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 +* Copyright (c) 2022 SEEKFREE 逐飞科技 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 +* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 +* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 +* +* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 +* 甚至没有隐含的适销性或适合特定用途的保证 +* 更多细节请参见 GPL +* +* 您应该在收到本开源库的同时收到一份 GPL 的副本 +* 如果没有,请参阅 +* +* 额外注明: +* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 +* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 +* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 +* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) +* +* 文件名称 seekfree_assistant_interface +* 公司名称 成都逐飞科技有限公司 +* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A +* 店铺链接 https://seekfree.taobao.com/ +* +* 修改记录 +* 日期 作者 备注 +* 2024-1-11 SeekFree first version +********************************************************************************************************************/ + +#ifndef _seekfree_assistant_interface_h_ +#define _seekfree_assistant_interface_h_ + + + +// 数据发送设备枚举 +typedef enum +{ + SEEKFREE_ASSISTANT_DEBUG_UART, // 调试串口 使用的串口由DEBUG_UART_INDEX宏定义指定 + SEEKFREE_ASSISTANT_WIRELESS_UART, // 无线转串口 + SEEKFREE_ASSISTANT_CH9141, // CH9141蓝牙 + SEEKFREE_ASSISTANT_WIFI_UART, // WIFI转串口 + SEEKFREE_ASSISTANT_WIFI_SPI, // 高速WIFI SPI + SEEKFREE_ASSISTANT_CUSTOM, // 自定义通讯方式 需要自行seekfree_assistant_transfer与seekfree_assistant_receive函数 +}seekfree_assistant_transfer_device_enum; + + +void seekfree_assistant_interface_init (seekfree_assistant_transfer_device_enum transfer_device); + + + +#endif diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_absolute_encoder.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_absolute_encoder.c index 7c80a3b..f9bc809 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_absolute_encoder.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_absolute_encoder.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_absolute_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_absolute_encoder.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_absolute_encoder.h index e6cc057..ed92906 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_absolute_encoder.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_absolute_encoder.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_absolute_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c index 500bccb..b0a06df 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_bluetooth_ch9141 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -54,7 +54,7 @@ #include "zf_device_camera.h" #include "zf_device_bluetooth_ch9141.h" -static fifo_obj_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 +static fifo_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 static uint8 bluetooth_ch9141_buffer[BLUETOOTH_CH9141_BUFFER_SIZE]; // 数据存放数组 static uint8 bluetooth_ch9141_data = 0; // 数据临时存放变量 diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h index 800be6c..ffb30b5 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h @@ -24,7 +24,7 @@ * 文件名称 main * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_camera.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_camera.c index 84c7aa0..68668c4 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_camera.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_camera.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_camera * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -45,7 +45,7 @@ #include "zf_device_camera.h" -fifo_obj_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 +fifo_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; // 定义摄像头接收数据缓冲区 uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // 定义摄像头数据发送到上位机的帧头 diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_camera.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_camera.h index 58efb06..2cd7d2d 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_camera.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_camera.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_camera * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -44,7 +44,7 @@ //=================================================摄像头公共库 基本配置================================================ #define CAMERA_RECEIVER_BUFFER_SIZE (8) // 定义摄像头接收数据缓冲区大小 -extern fifo_obj_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 +extern fifo_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 extern uint8 camera_send_image_frame_header[4]; // 声明摄像头数据发送到上位机的帧头 //=================================================摄像头公共库 基本配置================================================ diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_config.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_config.h index af6a3d8..6c8147d 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_config.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_config.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_config * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_dl1a.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_dl1a.c index 3e7410c..27be3a7 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_dl1a.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_dl1a.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1a * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_dl1a.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_dl1a.h index 89145d3..3176dd3 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_dl1a.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_dl1a.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1a * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_dl1b.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_dl1b.c index 90e64b3..96e472e 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_dl1b.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_dl1b.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1b * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_dl1b.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_dl1b.h index b144739..922b3ce 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_dl1b.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_dl1b.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1b * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_gnss.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_gnss.c new file mode 100644 index 0000000..caf7cd0 --- /dev/null +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_gnss.c @@ -0,0 +1,620 @@ +/********************************************************************************************************************* +* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* Copyright (c) 2022 SEEKFREE 逐飞科技 +* +* 本文件是 TC264 开源库的一部分 +* +* TC264 开源库 是免费软件 +* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 +* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 +* +* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 +* 甚至没有隐含的适销性或适合特定用途的保证 +* 更多细节请参见 GPL +* +* 您应该在收到本开源库的同时收到一份 GPL 的副本 +* 如果没有,请参阅 +* +* 额外注明: +* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 +* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 +* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 +* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) +* +* 文件名称 zf_device_gnss +* 公司名称 成都逐飞科技有限公司 +* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 +* 开发环境 ADS v1.9.20 +* 适用平台 TC264D +* 店铺链接 https://seekfree.taobao.com/ +* +* 修改记录 +* 日期 作者 备注 +* 2023-12-28 pudding first version +********************************************************************************************************************/ +/********************************************************************************************************************* +* 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* RX 查看 zf_device_gnss.h 中 GNSS_RX 宏定义 +* TX 查看 zf_device_gnss.h 中 GNSS_TX 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* ------------------------------------ +********************************************************************************************************************/ + +#include "math.h" +#include "zf_common_function.h" +#include "zf_common_fifo.h" +#include "zf_driver_delay.h" +#include "zf_driver_uart.h" + +#include "zf_device_gnss.h" + +#define GNSS_BUFFER_SIZE ( 128 ) + +uint8 gnss_flag = 0; // 1:采集完成等待处理数据 0:没有采集完成 +gnss_info_struct gnss; // GPS解析之后的数据 + +static uint8 gnss_state = 0; // 1:GPS初始化完成 +static fifo_struct gnss_receiver_fifo; // +static uint8 gnss_receiver_buffer[GNSS_BUFFER_SIZE]; // 数据存放数组 + +static gps_state_enum gnss_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 +static gps_state_enum gnss_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 +static gps_state_enum gnss_ths_state = GPS_STATE_RECEIVING; // rmc 语句状态 + +static uint8 gps_gga_buffer[GNSS_BUFFER_SIZE]; +static uint8 gps_rmc_buffer[GNSS_BUFFER_SIZE]; +static uint8 gps_ths_buffer[GNSS_BUFFER_SIZE]; + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 获取指定 ',' 后面的索引 +// 参数说明 num 第几个逗号 +// 参数说明 *str 字符串 +// 返回参数 uint8 返回索引 +// 使用示例 get_parameter_index(1, s); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 get_parameter_index (uint8 num, char *str) +{ + uint8 i = 0, j = 0; + char *temp = strchr(str, '\n'); + uint8 len = 0, len1 = 0; + + 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; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 给定字符串第一个 ',' 之前的数据转换为int +// 参数说明 *s 字符串 +// 返回参数 float 返回数值 +// 使用示例 get_int_number(&buf[get_parameter_index(7, buf)]); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static int get_int_number (char *s) +{ + char buf[10]; + uint8 i = 0; + int return_value = 0; + i = get_parameter_index(1, s); + i = i - 1; + strncpy(buf, s, i); + buf[i] = 0; + return_value = func_str_to_int(buf); + return return_value; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 给定字符串第一个 ',' 之前的数据转换为float +// 参数说明 *s 字符串 +// 返回参数 float 返回数值 +// 使用示例 get_float_number(&buf[get_parameter_index(8, buf)]); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static float get_float_number (char *s) +{ + uint8 i = 0; + char buf[15]; + float return_value = 0; + + i = get_parameter_index(1, s); + i = i - 1; + strncpy(buf, s, i); + buf[i] = 0; + return_value = (float)func_str_to_double(buf); + return return_value; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 给定字符串第一个 ',' 之前的数据转换为double +// 参数说明 *s 字符串 +// 返回参数 double 返回数值 +// 使用示例 get_double_number(&buf[get_parameter_index(3, buf)]); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static double get_double_number (char *s) +{ + uint8 i = 0; + char buf[15]; + double return_value = 0; + + i = get_parameter_index(1, s); + i = i - 1; + strncpy(buf, s, i); + buf[i] = 0; + return_value = func_str_to_double(buf); + return return_value; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 世界时间转换为北京时间 +// 参数说明 *time 保存的时间 +// 返回参数 void +// 使用示例 utc_to_btc(&gnss->time); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static void utc_to_btc (gps_time_struct *time) +{ + uint8 day_num = 0; + + time->hour = time->hour + 8; + if(23 < time->hour) + { + time->hour -= 24; + time->day += 1; + + if(2 == time->month) + { + day_num = 28; + if((0 == time->year % 4 && 0 != time->year % 100) || 0 == time->year % 400) // 判断是否为闰年 + { + day_num ++; // 闰月 2月为29天 + } + } + else + { + day_num = 31; // 1 3 5 7 8 10 12这些月份为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(12 < time->month) + { + time->month -= 12; + time->year ++; + } + } + } +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 RMC语句解析 +// 参数说明 *line 接收到的语句信息 +// 参数说明 *gnss 保存解析后的数据 +// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 +// 使用示例 gps_gnrmc_parse((char *)data_buffer, &gnss); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 gps_gnrmc_parse (char *line, gnss_info_struct *gnss) +{ + uint8 state = 0, temp = 0; + + double latitude = 0; // 纬度 + double longitude = 0; // 经度 + + double lati_cent_tmp = 0, lati_second_tmp = 0; + double long_cent_tmp = 0, long_second_tmp = 0; + float speed_tmp = 0; + char *buf = line; + uint8 return_state = 0; + + state = buf[get_parameter_index(2, buf)]; + + if('A' == state) // 如果数据有效 则解析数据 + { + return_state = 1; + gnss->state = 1; + gnss -> ns = buf[get_parameter_index(4, buf)]; + gnss -> 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)]); + + gnss->latitude_degree = (int)latitude / 100; // 纬度转换为度分秒 + lati_cent_tmp = (latitude - gnss->latitude_degree * 100); + gnss->latitude_cent = (int)lati_cent_tmp; + lati_second_tmp = (lati_cent_tmp - gnss->latitude_cent) * 6000; + gnss->latitude_second = (int)lati_second_tmp; + + gnss->longitude_degree = (int)longitude / 100; // 经度转换为度分秒 + long_cent_tmp = (longitude - gnss->longitude_degree * 100); + gnss->longitude_cent = (int)long_cent_tmp; + long_second_tmp = (long_cent_tmp - gnss->longitude_cent) * 6000; + gnss->longitude_second = (int)long_second_tmp; + + gnss->latitude = gnss->latitude_degree + lati_cent_tmp / 60; + gnss->longitude = gnss->longitude_degree + long_cent_tmp / 60; + + speed_tmp = get_float_number(&buf[get_parameter_index(7, buf)]); // 速度(海里/小时) + gnss->speed = speed_tmp * 1.85f; // 转换为公里/小时 + gnss->direction = get_float_number(&buf[get_parameter_index(8, buf)]); // 角度 + } + else + { + gnss->state = 0; + } + + // 在定位没有生效前也是有时间数据的,可以直接解析 + gnss->time.hour = (buf[7] - '0') * 10 + (buf[8] - '0'); // 时间 + gnss->time.minute = (buf[9] - '0') * 10 + (buf[10] - '0'); + gnss->time.second = (buf[11] - '0') * 10 + (buf[12] - '0'); + temp = get_parameter_index(9, buf); + gnss->time.day = (buf[temp + 0] - '0') * 10 + (buf[temp + 1] - '0'); // 日期 + gnss->time.month = (buf[temp + 2] - '0') * 10 + (buf[temp + 3] - '0'); + gnss->time.year = (buf[temp + 4] - '0') * 10 + (buf[temp + 5] - '0') + 2000; + + utc_to_btc(&gnss->time); + + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 GGA语句解析 +// 参数说明 *line 接收到的语句信息 +// 参数说明 *gnss 保存解析后的数据 +// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 +// 使用示例 gps_gngga_parse((char *)data_buffer, &gnss); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 gps_gngga_parse (char *line, gnss_info_struct *gnss) +{ + uint8 state = 0; + char *buf = line; + uint8 return_state = 0; + + state = buf[get_parameter_index(2, buf)]; + + if(',' != state) + { + gnss->satellite_used = (uint8)get_int_number(&buf[get_parameter_index(7, buf)]); + gnss->height = get_float_number(&buf[get_parameter_index(9, buf)]) + get_float_number(&buf[get_parameter_index(11, buf)]); // 高度 = 海拔高度 + 地球椭球面相对大地水准面的高度 + return_state = 1; + } + + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 THS语句解析 +// 参数说明 *line 接收到的语句信息 +// 参数说明 *gnss 保存解析后的数据 +// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 +// 使用示例 gps_gnths_parse((char *)data_buffer, &gnss); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 gps_gnths_parse (char *line, gnss_info_struct *gnss) +{ + uint8 state = 0; + char *buf = line; + uint8 return_state = 0; + + state = buf[get_parameter_index(2, buf)]; + + if('A' == state) + { + gnss->antenna_direction_state = 1; + gnss->antenna_direction = get_float_number(&buf[get_parameter_index(1, buf)]); + return_state = 1; + } + else + { + gnss->antenna_direction_state = 0; + } + + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 计算从第一个点到第二个点的距离 +// 参数说明 latitude1 第一个点的纬度 +// 参数说明 longitude1 第一个点的经度 +// 参数说明 latitude2 第二个点的纬度 +// 参数说明 longitude2 第二个点的经度 +// 返回参数 double 返回两点距离 +// 使用示例 get_two_points_distance(latitude1_1, longitude1, latitude2, longitude2); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +double get_two_points_distance (double latitude1, double longitude1, double latitude2, double longitude2) +{ + const double EARTH_RADIUS = 6378137; // 地球半径(单位:m) + double rad_latitude1 = 0; + double rad_latitude2 = 0; + double rad_longitude1 = 0; + double rad_longitude2 = 0; + double distance = 0; + double a = 0; + double b = 0; + + rad_latitude1 = ANGLE_TO_RAD(latitude1); // 根据角度计算弧度 + 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 里面实现的算法 + distance = distance * EARTH_RADIUS; + + return distance; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 计算从第一个点到第二个点的方位角 +// 参数说明 latitude1 第一个点的纬度 +// 参数说明 longitude1 第一个点的经度 +// 参数说明 latitude2 第二个点的纬度 +// 参数说明 longitude2 第二个点的经度 +// 返回参数 double 返回方位角(0至360) +// 使用示例 get_two_points_azimuth(latitude1_1, longitude1, latitude2, longitude2); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +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 ((0 < angle) ? angle : (angle + 360)); +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 解析GPS数据 +// 参数说明 void +// 返回参数 uint8 0-解析成功 1-解析失败 可能数据包错误 +// 使用示例 gps_data_parse(); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +uint8 gnss_data_parse (void) +{ + uint8 return_state = 0; + uint8 check_buffer[5] = {'0', 'x', 0x00, 0x00, 0x00}; + uint8 bbc_xor_origin = 0; + uint8 bbc_xor_calculation = 0; + uint32 data_len = 0; + + do + { + if(GPS_STATE_RECEIVED == gnss_rmc_state) + { + gnss_rmc_state = GPS_STATE_PARSING; + strncpy((char *)&check_buffer[2], strchr((const char *)gps_rmc_buffer, '*') + 1, 2); + bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); + for(bbc_xor_calculation = gps_rmc_buffer[1], data_len = 2; '*' != gps_rmc_buffer[data_len]; data_len ++) + { + bbc_xor_calculation ^= gps_rmc_buffer[data_len]; + } + if(bbc_xor_calculation != bbc_xor_origin) + { + // 数据校验失败 + return_state = 1; + break; + } + + gps_gnrmc_parse((char *)gps_rmc_buffer, &gnss); + } + gnss_rmc_state = GPS_STATE_RECEIVING; + + if(GPS_STATE_RECEIVED == gnss_gga_state) + { + gnss_gga_state = GPS_STATE_PARSING; + strncpy((char *)&check_buffer[2], strchr((const char *)gps_gga_buffer, '*') + 1, 2); + bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); + + for(bbc_xor_calculation = gps_gga_buffer[1], data_len = 2; '*' != gps_gga_buffer[data_len]; data_len ++) + { + bbc_xor_calculation ^= gps_gga_buffer[data_len]; + } + if(bbc_xor_calculation != bbc_xor_origin) + { + // 数据校验失败 + return_state = 1; + break; + } + + gps_gngga_parse((char *)gps_gga_buffer, &gnss); + } + gnss_gga_state = GPS_STATE_RECEIVING; + + if(GPS_STATE_RECEIVED == gnss_ths_state) + { + gnss_ths_state = GPS_STATE_PARSING; + strncpy((char *)&check_buffer[2], strchr((const char *)gps_ths_buffer, '*') + 1, 2); + bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); + + for(bbc_xor_calculation = gps_ths_buffer[1], data_len = 2; '*' != gps_ths_buffer[data_len]; data_len ++) + { + bbc_xor_calculation ^= gps_ths_buffer[data_len]; + } + if(bbc_xor_calculation != bbc_xor_origin) + { + // 数据校验失败 + return_state = 1; + break; + } + + gps_gnths_parse((char *)gps_ths_buffer, &gnss); + } + gnss_ths_state = GPS_STATE_RECEIVING; + + }while(0); + return return_state; +} + + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 GPS串口回调函数 +// 参数说明 void +// 返回参数 void +// 使用示例 gps_uart_callback(); +// 备注信息 此函数需要在串口接收中断内进行调用 +//------------------------------------------------------------------------------------------------------------------- +void gnss_uart_callback (void) +{ + uint8 temp_gps[6]; + uint32 temp_length = 0; + + + + + if(gnss_state) + { + uint8 dat; + while(uart_query_byte(GNSS_UART, &dat)) + { + fifo_write_buffer(&gnss_receiver_fifo, &dat, 1); + } + + if('\n' == dat) + { + // 读取前6个数据 用于判断语句类型 + temp_length = 6; + fifo_read_buffer(&gnss_receiver_fifo, temp_gps, &temp_length, FIFO_READ_ONLY); + + // 根据不同类型将数据拷贝到不同的缓冲区 + if(0 == strncmp((char *)&temp_gps[3], "RMC", 3)) + { + // 如果没有在解析数据则更新缓冲区的数据 + if(GPS_STATE_PARSING != gnss_rmc_state) + { + gnss_rmc_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_rmc_buffer, &temp_length, FIFO_READ_AND_CLEAN); + } + } + else if(0 == strncmp((char *)&temp_gps[3], "GGA", 3)) + { + // 如果没有在解析数据则更新缓冲区的数据 + if(GPS_STATE_PARSING != gnss_gga_state) + { + gnss_gga_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_gga_buffer, &temp_length, FIFO_READ_AND_CLEAN); + } + } + else if(0 == strncmp((char *)&temp_gps[3], "THS", 3)) + { + // 如果没有在解析数据则更新缓冲区的数据 + if(GPS_STATE_PARSING != gnss_ths_state) + { + gnss_ths_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_ths_buffer, &temp_length, FIFO_READ_AND_CLEAN); + } + } + + // 统一将FIFO清空 + fifo_clear(&gnss_receiver_fifo); + + gnss_flag = 1; + } + } +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 GPS初始化 +// 参数说明 void +// 返回参数 void +// 使用示例 gps_init(); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +void gnss_init (gps_device_enum gps_device) +{ + 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}; + + if((TAU1201 == gps_device) || (GN42A == gps_device)) + { + fifo_init(&gnss_receiver_fifo, FIFO_DATA_8BIT, gnss_receiver_buffer, GNSS_BUFFER_SIZE); + system_delay_ms(500); // 等待GPS启动后开始初始化 + uart_init(GNSS_UART, 115200, GNSS_RX, GNSS_TX); + + uart_write_buffer(GNSS_UART, (uint8 *)set_rate, sizeof(set_rate)); // 设置GPS更新速率为10hz 如果不调用此语句则默认为1hz + system_delay_ms(200); + + uart_write_buffer(GNSS_UART, (uint8 *)open_rmc, sizeof(open_rmc)); // 开启rmc语句 + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)open_gga, sizeof(open_gga)); // 开启gga语句 + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gll, sizeof(close_gll)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gsa, sizeof(close_gsa)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_grs, sizeof(close_grs)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gsv, sizeof(close_gsv)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_vtg, sizeof(close_vtg)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_zda, sizeof(close_zda)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gst, sizeof(close_gst)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_txt, sizeof(close_txt)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_txt_ant, sizeof(close_txt_ant)); + system_delay_ms(50); + + gnss_state = 1; + uart_rx_interrupt(GNSS_UART, 1); + } + else if(GN43RFA == gps_device) + { + // GN43RFA RTK模块不需要进行参数设置,如果需要修改参数应该使用专用的上位机修改参数 + fifo_init(&gnss_receiver_fifo, FIFO_DATA_8BIT, gnss_receiver_buffer, GNSS_BUFFER_SIZE); + uart_init(GNSS_UART, 115200, GNSS_RX, GNSS_TX); + gnss_state = 1; + uart_rx_interrupt(GNSS_UART, 1); + } + +} diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_gnss.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_gnss.h new file mode 100644 index 0000000..5d58976 --- /dev/null +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_gnss.h @@ -0,0 +1,125 @@ +/********************************************************************************************************************* +* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* Copyright (c) 2022 SEEKFREE 逐飞科技 +* +* 本文件是 TC264 开源库的一部分 +* +* TC264 开源库 是免费软件 +* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 +* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 +* +* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 +* 甚至没有隐含的适销性或适合特定用途的保证 +* 更多细节请参见 GPL +* +* 您应该在收到本开源库的同时收到一份 GPL 的副本 +* 如果没有,请参阅 +* +* 额外注明: +* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 +* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 +* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 +* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) +* +* 文件名称 zf_device_gnss +* 公司名称 成都逐飞科技有限公司 +* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 +* 开发环境 ADS v1.9.20 +* 适用平台 TC264D +* 店铺链接 https://seekfree.taobao.com/ +* +* 修改记录 +* 日期 作者 备注 +* 2023-12-28 pudding first version +********************************************************************************************************************/ +/********************************************************************************************************************* +* 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* RX 查看 zf_device_gnss.h 中 GNSS_RX 宏定义 +* TX 查看 zf_device_gnss.h 中 GNSS_TX 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* ------------------------------------ +********************************************************************************************************************/ + +#ifndef _zf_device_gnss_h_ +#define _zf_device_gnss_h_ + +#include "zf_common_typedef.h" + +//-------------------------------------------------------------------------------------------------- +//引脚配置 +//-------------------------------------------------------------------------------------------------- +#define GNSS_UART (UART_3) +#define GNSS_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 +#define GNSS_TX (UART3_RX_P15_7) // GPS TX串口引脚 + +#define ANGLE_TO_RAD(x) ( (x) * PI / 180.0 ) // 角度转换为弧度 +#define RAD_TO_ANGLE(x) ( (x) * 180.0 / PI ) // 弧度转换为角度 +#define PI ( 3.1415926535898 ) + +typedef enum +{ + TAU1201 = 1, // 逐飞科技双频GPS模块 + GN42A = 1, // 逐飞科技双频GPS模块 与TAU1201是一样的 + GN43RFA = 2, // 逐飞科技三频RTK模块 +}gps_device_enum; + +typedef struct +{ + uint16 year; + uint8 month; + uint8 day; + uint8 hour; + uint8 minute; + uint8 second; +}gps_time_struct; + +typedef struct +{ + gps_time_struct time; // 时间 + + uint8 state; // 有效状态 1:定位有效 0:定位无效 + + uint16 latitude_degree; // 度 + uint16 latitude_cent; // 分 + uint16 latitude_second; // 秒 这里的秒是被放大了100倍的,主要是避免使用浮点数 + uint16 longitude_degree; // 度 + uint16 longitude_cent; // 分 + uint16 longitude_second; // 秒 这里的秒是被放大了100倍的,主要是避免使用浮点数 + + double latitude; // 纬度 + double longitude; // 经度 + + int8 ns; // 纬度半球 N(北半球)或 S(南半球) + int8 ew; // 经度半球 E(东经)或 W(西经) + + float speed; // 速度(公里/每小时) + float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准)+ + uint8 antenna_direction_state; // 双天线测向有效状态 1:测向有效 0:测向无效,无效时antenna_direction数据是无效的 + float antenna_direction; // 主天线指向从天线与真北构成的夹角(000.0~359.9 度) + + // 下面两个个信息从GNGGA语句中获取 + uint8 satellite_used; // 用于定位的卫星数量 + float height; // 高度 +}gnss_info_struct; + +typedef enum +{ + GPS_STATE_RECEIVING, // 正在接收数据 + GPS_STATE_RECEIVED, // 数据接收完成 + GPS_STATE_PARSING, // 正在解析 +}gps_state_enum; + +extern gnss_info_struct gnss; +extern uint8 gnss_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); +uint8 gnss_data_parse (void); +void gnss_uart_callback (void); +void gnss_init (gps_device_enum gps_device); + +#endif diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_gps_tau1201.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_gps_tau1201.c deleted file mode 100644 index da46a99..0000000 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_gps_tau1201.c +++ /dev/null @@ -1,541 +0,0 @@ -/********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 -* Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 -* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 -* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* -* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 -* 甚至没有隐含的适销性或适合特定用途的保证 -* 更多细节请参见 GPL -* -* 您应该在收到本开源库的同时收到一份 GPL 的副本 -* 如果没有,请参阅 -* -* 额外注明: -* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 -* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 -* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 -* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* -* 文件名称 zf_device_gps_tau1201 -* 公司名称 成都逐飞科技有限公司 -* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D -* 店铺链接 https://seekfree.taobao.com/ -* -* 修改记录 -* 日期 作者 备注 -* 2022-09-15 pudding first version -* 2023-04-28 pudding 增加中文注释说明 -********************************************************************************************************************/ -/******************************************************************************************************************** -* 接线定义: -* ------------------------------------ -* 模块管脚 单片机管脚 -* RX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_RX 宏定义 -* TX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_TX 宏定义 -* VCC 3.3V电源 -* GND 电源地 -* ------------------------------------ -********************************************************************************************************************/ - -#include "math.h" -#include "zf_common_function.h" -#include "zf_common_fifo.h" -#include "zf_driver_delay.h" -#include "zf_driver_uart.h" - -#include "zf_device_gps_tau1201.h" - -#define GPS_TAU1201_BUFFER_SIZE ( 128 ) - -uint8 gps_tau1201_flag = 0; // 1:采集完成等待处理数据 0:没有采集完成 -gps_info_struct gps_tau1201; // GPS解析之后的数据 - -static uint8 gps_tau1201_state = 0; // 1:GPS初始化完成 -static fifo_obj_struct gps_tau1201_receiver_fifo; // -static uint8 gps_tau1201_receiver_buffer[GPS_TAU1201_BUFFER_SIZE]; // 数据存放数组 - -gps_state_enum gps_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 -gps_state_enum gps_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 - -static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; // GGA语句缓冲区 -static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; // RMC语句缓冲区 - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 获取指定 ',' 后面的索引 -// 参数说明 num 第几个逗号 -// 参数说明 *str 字符串 -// 返回参数 uint8 返回索引 -// 使用示例 get_parameter_index(1, s); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static uint8 get_parameter_index (uint8 num, char *str) -{ - uint8 i = 0, j = 0; - char *temp = strchr(str, '\n'); - uint8 len = 0, len1 = 0; - - 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; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 给定字符串第一个 ',' 之前的数据转换为int -// 参数说明 *s 字符串 -// 返回参数 float 返回数值 -// 使用示例 get_int_number(&buf[get_parameter_index(7, buf)]); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static int get_int_number (char *s) -{ - char buf[10]; - uint8 i = 0; - int return_value = 0; - i = get_parameter_index(1, s); - i = i - 1; - strncpy(buf, s, i); - buf[i] = 0; - return_value = func_str_to_int(buf); - return return_value; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 给定字符串第一个 ',' 之前的数据转换为float -// 参数说明 *s 字符串 -// 返回参数 float 返回数值 -// 使用示例 get_float_number(&buf[get_parameter_index(8, buf)]); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static float get_float_number (char *s) -{ - uint8 i = 0; - char buf[15]; - float return_value = 0; - - i = get_parameter_index(1, s); - i = i - 1; - strncpy(buf, s, i); - buf[i] = 0; - return_value = (float)func_str_to_double(buf); - return return_value; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 给定字符串第一个 ',' 之前的数据转换为double -// 参数说明 *s 字符串 -// 返回参数 double 返回数值 -// 使用示例 get_double_number(&buf[get_parameter_index(3, buf)]); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static double get_double_number (char *s) -{ - uint8 i = 0; - char buf[15]; - double return_value = 0; - - i = get_parameter_index(1, s); - i = i - 1; - strncpy(buf, s, i); - buf[i] = 0; - return_value = func_str_to_double(buf); - return return_value; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 世界时间转换为北京时间 -// 参数说明 *time 保存的时间 -// 返回参数 void -// 使用示例 utc_to_btc(&gps->time); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static void utc_to_btc (gps_time_struct *time) -{ - uint8 day_num = 0; - - time->hour = time->hour + 8; - if(23 < time->hour) - { - time->hour -= 24; - time->day += 1; - - if(2 == time->month) - { - day_num = 28; - if((0 == time->year % 4 && 0 != time->year % 100) || 0 == time->year % 400) // 判断是否为闰年 - { - day_num ++; // 闰月 2月为29天 - } - } - else - { - day_num = 31; // 1 3 5 7 8 10 12这些月份为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(12 < time->month) - { - time->month -= 12; - time->year ++; - } - } - } -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 RMC语句解析 -// 参数说明 *line 接收到的语句信息 -// 参数说明 *gps 保存解析后的数据 -// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 -// 使用示例 gps_gnrmc_parse((char *)data_buffer, &gps_tau1201); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static uint8 gps_gnrmc_parse (char *line, gps_info_struct *gps) -{ - uint8 state = 0, temp = 0; - - double latitude = 0; // 纬度 - double longitude = 0; // 经度 - - double lati_cent_tmp = 0, lati_second_tmp = 0; - double long_cent_tmp = 0, long_second_tmp = 0; - float speed_tmp = 0; - char *buf = line; - uint8 return_state = 0; - - state = buf[get_parameter_index(2, buf)]; - - gps->state = 0; - if('A' == state) // 如果数据有效 则解析数据 - { - return_state = 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; // 纬度转换为度分秒 - lati_cent_tmp = (latitude - gps->latitude_degree * 100); - gps->latitude_cent = (int)lati_cent_tmp; - lati_second_tmp = (lati_cent_tmp - gps->latitude_cent) * 6000; - gps->latitude_second = (int)lati_second_tmp; - - gps->longitude_degree = (int)longitude / 100; // 经度转换为度分秒 - long_cent_tmp = (longitude - gps->longitude_degree * 100); - gps->longitude_cent = (int)long_cent_tmp; - long_second_tmp = (long_cent_tmp - gps->longitude_cent) * 6000; - gps->longitude_second = (int)long_second_tmp; - - gps->latitude = gps->latitude_degree + lati_cent_tmp / 60; - gps->longitude = gps->longitude_degree + long_cent_tmp / 60; - - speed_tmp = get_float_number(&buf[get_parameter_index(7, buf)]); // 速度(海里/小时) - gps->speed = speed_tmp * 1.85f; // 转换为公里/小时 - gps->direction = get_float_number(&buf[get_parameter_index(8, buf)]); // 角度 - } - - // 在定位没有生效前也是有时间数据的,可以直接解析 - gps->time.hour = (buf[7] - '0') * 10 + (buf[8] - '0'); // 时间 - 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'); // 日期 - 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_state; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 GGA语句解析 -// 参数说明 *line 接收到的语句信息 -// 参数说明 *gps 保存解析后的数据 -// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 -// 使用示例 gps_gngga_parse((char *)data_buffer, &gps_tau1201); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static uint8 gps_gngga_parse (char *line, gps_info_struct *gps) -{ - uint8 state = 0; - char *buf = line; - uint8 return_state = 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)]); // 高度 = 海拔高度 + 地球椭球面相对大地水准面的高度 - return_state = 1; - } - - return return_state; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 计算从第一个点到第二个点的距离 -// 参数说明 latitude1 第一个点的纬度 -// 参数说明 longitude1 第一个点的经度 -// 参数说明 latitude2 第二个点的纬度 -// 参数说明 longitude2 第二个点的经度 -// 返回参数 double 返回两点距离 -// 使用示例 get_two_points_distance(latitude1_1, longitude1, latitude2, longitude2); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -double get_two_points_distance (double latitude1, double longitude1, double latitude2, double longitude2) -{ - const double EARTH_RADIUS = 6378137; // 地球半径(单位:m) - double rad_latitude1 = 0; - double rad_latitude2 = 0; - double rad_longitude1 = 0; - double rad_longitude2 = 0; - double distance = 0; - double a = 0; - double b = 0; - - rad_latitude1 = ANGLE_TO_RAD(latitude1); // 根据角度计算弧度 - 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 里面实现的算法 - distance = distance * EARTH_RADIUS; - - return distance; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 计算从第一个点到第二个点的方位角 -// 参数说明 latitude1 第一个点的纬度 -// 参数说明 longitude1 第一个点的经度 -// 参数说明 latitude2 第二个点的纬度 -// 参数说明 longitude2 第二个点的经度 -// 返回参数 double 返回方位角(0至360) -// 使用示例 get_two_points_azimuth(latitude1_1, longitude1, latitude2, longitude2); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -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 ((0 < angle) ? angle : (angle + 360)); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 解析GPS数据 -// 参数说明 void -// 返回参数 uint8 0-解析成功 1-解析失败 可能数据包错误 -// 使用示例 gps_data_parse(); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -uint8 gps_data_parse (void) -{ - uint8 return_state = 0; - uint8 check_buffer[5] = {'0', 'x', 0x00, 0x00, 0x00}; - uint8 bbc_xor_origin = 0; - uint8 bbc_xor_calculation = 0; - uint32 data_len = 0; - - do - { - if(GPS_STATE_RECEIVED == gps_rmc_state) - { - gps_rmc_state = GPS_STATE_PARSING; - strncpy((char *)&check_buffer[2], strchr((const char *)gps_rmc_buffer, '*') + 1, 2); - bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); - for(bbc_xor_calculation = gps_rmc_buffer[1], data_len = 2; '*' != gps_rmc_buffer[data_len]; data_len ++) - { - bbc_xor_calculation ^= gps_rmc_buffer[data_len]; - } - if(bbc_xor_calculation != bbc_xor_origin) - { - // 数据校验失败 - return_state = 1; - break; - } - - gps_gnrmc_parse((char *)gps_rmc_buffer, &gps_tau1201); - } - gps_rmc_state = GPS_STATE_RECEIVING; - - if(GPS_STATE_RECEIVED == gps_gga_state) - { - gps_gga_state = GPS_STATE_PARSING; - strncpy((char *)&check_buffer[2], strchr((const char *)gps_gga_buffer, '*') + 1, 2); - bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); - - for(bbc_xor_calculation = gps_gga_buffer[1], data_len = 2; '*' != gps_gga_buffer[data_len]; data_len ++) - { - bbc_xor_calculation ^= gps_gga_buffer[data_len]; - } - if(bbc_xor_calculation != bbc_xor_origin) - { - // 数据校验失败 - return_state = 1; - break; - } - - gps_gngga_parse((char *)gps_gga_buffer, &gps_tau1201); - } - gps_gga_state = GPS_STATE_RECEIVING; - - }while(0); - return return_state; -} - - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 GPS串口回调函数 -// 参数说明 void -// 返回参数 void -// 使用示例 gps_uart_callback(); -// 备注信息 此函数需要在串口接收中断内进行调用 -//------------------------------------------------------------------------------------------------------------------- -void gps_uart_callback (void) -{ - uint8 temp_gps[6]; - uint32 temp_length = 0; - - if(gps_tau1201_state) - { - uint8 dat; - while(uart_query_byte(GPS_TAU1201_UART, &dat)) - { - fifo_write_buffer(&gps_tau1201_receiver_fifo, &dat, 1); - } - - if('\n' == dat) - { - // 读取前6个数据 用于判断语句类型 - temp_length = 6; - fifo_read_buffer(&gps_tau1201_receiver_fifo, temp_gps, &temp_length, FIFO_READ_ONLY); - - // 根据不同类型将数据拷贝到不同的缓冲区 - if(0 == strncmp((char *)&temp_gps[3], "RMC", 3)) - { - // 如果没有在解析数据则更新缓冲区的数据 - if(GPS_STATE_PARSING != gps_rmc_state) - { - gps_rmc_state = GPS_STATE_RECEIVED; - temp_length = fifo_used(&gps_tau1201_receiver_fifo); - fifo_read_buffer(&gps_tau1201_receiver_fifo, gps_rmc_buffer, &temp_length, FIFO_READ_AND_CLEAN); - } - } - else if(0 == strncmp((char *)&temp_gps[3], "GGA", 3)) - { - // 如果没有在解析数据则更新缓冲区的数据 - if(GPS_STATE_PARSING != gps_gga_state) - { - gps_gga_state = GPS_STATE_RECEIVED; - temp_length = fifo_used(&gps_tau1201_receiver_fifo); - fifo_read_buffer(&gps_tau1201_receiver_fifo, gps_gga_buffer, &temp_length, FIFO_READ_AND_CLEAN); - } - } - - // 统一将FIFO清空 - fifo_clear(&gps_tau1201_receiver_fifo); - - gps_tau1201_flag = 1; - } - } -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 GPS初始化 -// 参数说明 void -// 返回参数 void -// 使用示例 gps_init(); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -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}; - - fifo_init(&gps_tau1201_receiver_fifo, FIFO_DATA_8BIT, gps_tau1201_receiver_buffer, GPS_TAU1201_BUFFER_SIZE); - system_delay_ms(500); // 等待GPS启动后开始初始化 - uart_init(GPS_TAU1201_UART, 115200, GPS_TAU1201_RX, GPS_TAU1201_TX); - uart_rx_interrupt(GPS_TAU1201_UART, 0); - - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)set_rate, sizeof(set_rate)); // 设置GPS更新速率为10hz 如果不调用此语句则默认为1hz - system_delay_ms(200); - - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)open_rmc, sizeof(open_rmc)); // 开启rmc语句 - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)open_gga, sizeof(open_gga)); // 开启gga语句 - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gll, sizeof(close_gll)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gsa, sizeof(close_gsa)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_grs, sizeof(close_grs)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gsv, sizeof(close_gsv)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_vtg, sizeof(close_vtg)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_zda, sizeof(close_zda)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gst, sizeof(close_gst)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_txt, sizeof(close_txt)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_txt_ant, sizeof(close_txt_ant)); - system_delay_ms(50); - - gps_tau1201_state = 1; - uart_rx_interrupt(GPS_TAU1201_UART, 1); -} diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_gps_tau1201.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_gps_tau1201.h deleted file mode 100644 index c167bae..0000000 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_gps_tau1201.h +++ /dev/null @@ -1,117 +0,0 @@ -/********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 -* Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 -* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 -* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* -* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 -* 甚至没有隐含的适销性或适合特定用途的保证 -* 更多细节请参见 GPL -* -* 您应该在收到本开源库的同时收到一份 GPL 的副本 -* 如果没有,请参阅 -* -* 额外注明: -* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 -* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 -* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 -* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* -* 文件名称 zf_device_gps_tau1201 -* 公司名称 成都逐飞科技有限公司 -* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D -* 店铺链接 https://seekfree.taobao.com/ -* -* 修改记录 -* 日期 作者 备注 -* 2022-09-15 pudding first version -* 2023-04-28 pudding 增加中文注释说明 -********************************************************************************************************************/ -/******************************************************************************************************************** -* 接线定义: -* ------------------------------------ -* 模块管脚 单片机管脚 -* RX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_RX 宏定义 -* TX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_TX 宏定义 -* VCC 3.3V电源 -* GND 电源地 -* ------------------------------------ -********************************************************************************************************************/ - -#ifndef _zf_device_gps_tau1201_h_ -#define _zf_device_gps_tau1201_h_ - -#include "zf_common_typedef.h" - -//=================================================定义 定位模块 基本配置================================================ -#define GPS_TAU1201_UART (UART_3) -#define GPS_TAU1201_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 -#define GPS_TAU1201_TX (UART3_RX_P15_7) // GPS TX串口引脚 - -#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 -#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 -#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; // 时间- - uint8 state; // 有效状态 1:定位有效 0:定位无效 - uint16 latitude_degree; // 度 - uint16 latitude_cent; // 分 - uint16 latitude_second; // 秒 - uint16 longitude_degree; // 度 - uint16 longitude_cent; // 分 - uint16 longitude_second; // 秒 - double latitude; // 纬度 - double longitude; // 经度 - int8 ns; // 纬度半球 N(北半球)或 S(南半球) - int8 ew; // 经度半球 E(东经)或 W(西经) - float speed; // 速度(公里/每小时) - float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) - // 下面两个个信息从GNGGA语句中获取 - uint8 satellite_used; // 用于定位的卫星数量 - float height; // 高度 -}gps_info_struct; - -typedef enum -{ - GPS_STATE_RECEIVING, // 正在接收数据 - GPS_STATE_RECEIVED, // 数据接收完成 - GPS_STATE_PARSING, // 正在解析 -}gps_state_enum; -//================================================定义 定位模块 参数结构体================================================ - - -//=================================================声明 定位模块 全局变量================================================ -extern gps_info_struct gps_tau1201; // GPS解析之后的数据 -extern uint8 gps_tau1201_flag; // 1:采集完成等待处理数据 0:没有采集完成 -//=================================================声明 定位模块 全局变量================================================ - - -//=================================================声明 定位模块 基础函数================================================ -double get_two_points_distance (double lat1, double lng1, double lat2, double lng2); // 计算从第一个点到第二个点的距离(单位:m) -double get_two_points_azimuth (double lat1, double lon1, double lat2, double lon2); // 计算从第一个点到第二个点的方位角(单位:°) -uint8 gps_data_parse (void); // 解析GPS数据 -void gps_uart_callback (void); // GPS回调函数 -void gps_init (void); // GPS初始化 -//=================================================声明 定位模块 基础函数================================================ -#endif diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_icm20602.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_icm20602.c index f4ae830..ddebf3c 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_icm20602.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_icm20602.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_icm20602 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_icm20602.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_icm20602.h index 67724ad..209972b 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_icm20602.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_icm20602.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_icm20602 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_imu660ra.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_imu660ra.c index 95144f9..02fdb9e 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_imu660ra.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_imu660ra.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu660ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_imu660ra.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_imu660ra.h index a689df1..348e6a1 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_imu660ra.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_imu660ra.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu660ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_imu963ra.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_imu963ra.c index 92ec0f6..595142a 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_imu963ra.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_imu963ra.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu963ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_imu963ra.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_imu963ra.h index 4d0d9f9..c0f981f 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_imu963ra.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_imu963ra.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu963ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ips114.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ips114.c index 78c6f3b..b13e338 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ips114.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ips114.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips114 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ips114.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ips114.h index 81dfc3c..ba932b1 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ips114.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ips114.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips114 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ips200.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ips200.c index cd8681f..37d9d04 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ips200.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ips200.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips200 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ips200.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ips200.h index ce59927..045bf27 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ips200.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ips200.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips200 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_key.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_key.c index 9e42c8a..8b240cb 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_key.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_key.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_key * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_key.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_key.h index bcab8aa..9c653cf 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_key.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_key.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_key * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_mpu6050.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_mpu6050.c index dc3c5b2..101a5ae 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_mpu6050.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_mpu6050.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_mpu6050 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_mpu6050.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_mpu6050.h index 3510e06..c8a086f 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_mpu6050.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_mpu6050.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_mpu6050 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_mt9v03x.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_mt9v03x.c index 231cfec..d38b8df 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_mt9v03x.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_mt9v03x.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_mt9v03x * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_mt9v03x.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_mt9v03x.h index 7786bc5..9d4650d 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_mt9v03x.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_mt9v03x.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_mt9v03x * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_oled.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_oled.c index 5314209..55aefa7 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_oled.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_oled.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_oled * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_oled.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_oled.h index d52d2fd..aadf048 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_oled.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_oled.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_oled * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ov7725.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ov7725.c index 12f6095..bac95fe 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ov7725.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ov7725.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ov7725 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ov7725.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ov7725.h index f45a4e8..2cb4026 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ov7725.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ov7725.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ov7725 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_scc8660.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_scc8660.c index 3483c93..38d65ff 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_scc8660.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_scc8660.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_scc8660 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_scc8660.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_scc8660.h index 815d272..537283a 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_scc8660.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_scc8660.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_scc8660 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_tft180.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_tft180.c index db50824..b661e91 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_tft180.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_tft180.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_tft180 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_tft180.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_tft180.h index 47491ee..54a72b3 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_tft180.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_tft180.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_tft180 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_tsl1401.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_tsl1401.c index 3f9db7f..d133c7c 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_tsl1401.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_tsl1401.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_tsl1401 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_tsl1401.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_tsl1401.h index 1fab12e..a7b061c 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_tsl1401.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_tsl1401.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_tsl1401 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_type.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_type.c index 497ba55..af24701 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_type.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_type.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_type * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -32,6 +32,7 @@ * 日期 作者 备注 * 2022-09-15 pudding first version * 2023-05-26 pudding 新增SPI WIFI 中断回调指针 +* 2024-01-16 pudding 移除SPI WIFI 中断回调指针 SPI WIFI将不再使用外部 ********************************************************************************************************************/ #include "zf_device_type.h" @@ -45,7 +46,6 @@ callback_function camera_dma_handler = type_default_callback; wireless_type_enum wireless_type = NO_WIRELESS; callback_function wireless_module_uart_handler = type_default_callback; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 -callback_function wireless_module_spi_handler = type_default_callback; // WIFI SPI GPIO中断函数指针,根据初始化时设置的函数进行跳转 tof_type_enum tof_type = NO_TOF; callback_function tof_module_exti_handler = type_default_callback; // ToF 模块 INT 更新中断 @@ -54,7 +54,7 @@ callback_function tof_module_exti_handler = type_default_callback; // 函数简介 默认回调函数 // 参数说明 void // 返回参数 void -// 使用示例 +// 使用示例 // 备注信息 保护性冗余设计 防止在没有初始化设备的时候跑飞 //------------------------------------------------------------------------------------------------------------------- static void type_default_callback (void) @@ -90,14 +90,7 @@ void set_camera_type (camera_type_enum type_set, callback_function vsync_callba void set_wireless_type (wireless_type_enum type_set, callback_function wireless_callback) { wireless_type = type_set; - if(WIFI_SPI == wireless_type) - { - wireless_module_spi_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); - } - else - { - wireless_module_uart_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); - } + wireless_module_uart_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); } //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_type.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_type.h index 19c36ca..3b124fe 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_type.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_type.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_type * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -56,7 +56,6 @@ typedef enum WIRELESS_UART, // 无线串口 BLUETOOTH_CH9141, // 蓝牙 CH9141 WIFI_UART, // 串口 WiFi - WIFI_SPI // SPI WiFi }wireless_type_enum; typedef enum diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c index 2bdb164..3cbc786 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_virtual_oscilloscope * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h index f518026..b0fd085 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_virtual_oscilloscope * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_wifi_spi.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_wifi_spi.c index 78a6d68..f9e51ca 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_wifi_spi.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_wifi_spi.c @@ -24,14 +24,13 @@ * 文件名称 zf_device_wifi_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 * 日期 作者 备注 -* 2023-05-27 pudding first version -* 2023-05-29 pudding 新增关闭休眠指令,提升通讯效率 +* 2022-09-21 SeekFree first version ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,1374 +52,615 @@ #include "zf_common_clock.h" #include "zf_common_debug.h" #include "zf_common_fifo.h" -#include "zf_common_function.h" #include "zf_driver_delay.h" #include "zf_driver_gpio.h" -#include "zf_common_interrupt.h" -#include "zf_driver_exti.h" #include "zf_driver_spi.h" #include "zf_device_type.h" #include "zf_device_wifi_spi.h" -#define WAIT_TIME_OUT (10000) // 单指令等待时间 单位:ms +#define WIFI_CONNECT_TIME_OUT 10000 // 单位毫秒 +#define SOCKET_CONNECT_TIME_OUT 50000 // 单位毫秒 +#define OTHER_TIME_OUT 1000 // 单位毫秒 -#define WIFI_SPI_WRITE_MAX 128 // 定义一次SPI通讯最大发送的数据长度 - -#define WIFI_SPI_WRITE_REQUEST 0x01 -#define WIFI_SPI_CHECK_STATE 0x02 -#define WIFI_SPI_WRITE_DATA 0x03 -#define WIFI_SPI_READ_DATA 0x04 -#define WIFI_SPI_WRITE_END 0x07 -#define WIFI_SPI_READ_END 0x08 - -#define WIFI_SPI_WRITE_ADDR 0x00 -#define WIFI_SPI_STATE_ADDR 0x04 +char wifi_spi_version[12]; // 保存模块固件版本信息 +char wifi_spi_mac_addr[20]; // 保存模块MAC地址信息 +char wifi_spi_ip_addr_port[25]; // 保存模块IP地址与端口信息 -volatile wifi_spi_buffer_state_enum wifi_buffer_state; -volatile wifi_spi_transmit_state_enum wifi_transmit_state; - -static fifo_obj_struct wifi_spi_fifo; -static uint8 wifi_spi_buffer[WIFI_SPI_BUFFER_SIZE]; // 数据存放数组 - -vuint8 wifi_spi_ack_flag = 0; // 0:模块未应答 1:模块已应答 -uint8 wifi_spi_init_flag; // 0:模块未初始化成功或者未连接 1:模块已连接并成功初始化 -vuint8 wifi_spi_packet_num; // 发送的数据包ID -vuint32 wifi_spi_send_remain_length; // 剩余的发送长度 - - - -wifi_spi_information_struct wifi_spi_information; +static fifo_struct wifi_spi_fifo; +static uint8 wifi_spi_buffer[WIFI_SPI_RECVIVE_FIFO_SIZE]; +static volatile wifi_spi_state_enum wifi_spi_mutex; //------------------------------------------------------------------------------------------------------------------- -// 函数简介 请求写入数据到模块 -// 参数说明 length 需要写入的长度 -// @return void -// Sample usage: +// 函数简介 等待WIFI SPI就绪 +// 参数说明 wait_time 最大等待时间 单位毫秒 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_write_request(uint16 length) +static uint8 wifi_spi_wait_idle (uint32 wait_time) { - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_REQUEST; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - head.magic = 0xFE; - head.sequence = wifi_spi_packet_num++; - head.length = length; + uint32 time = 0; - wifi_transmit_state = TRANSMIT_WRITE_REQUEST; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 7); - gpio_set_level(WIFI_SPI_CS_PIN, 1); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 读取模块状态 -// 参数说明 *length 需要读取或者写入的长度 -// @return WIFI_SPI_BUFFER_STATE_enum 模块状态 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static wifi_spi_buffer_state_enum wifi_spi_read_state(uint16 *length) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_CHECK_STATE; - head.addr = WIFI_SPI_STATE_ADDR; - head.dummy = 0x00; - - wifi_spi_ack_flag = 0; - wifi_transmit_state = TRANSMIT_READ_STATE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_transfer_8bit(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, &head.cmd, 7); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - - if(BUFFER_WRITE == head.magic) + wait_time = wait_time*100; + while(0 == gpio_get_level(WIFI_SPI_INT_PIN)) { - wifi_spi_packet_num = head.sequence; - } - *length = head.length; - - return (wifi_spi_buffer_state_enum)head.magic; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据发送完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_done(void) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_END; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_transmit_state = TRANSMIT_IDLE; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据接收完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_start(void) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_READ_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - wifi_transmit_state = TRANSMIT_READ; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据接收完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_done(void) -{ - wifi_spi_buffer_struct head; - - gpio_set_level(WIFI_SPI_CS_PIN, 1); - - head.cmd = WIFI_SPI_READ_END; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_transmit_state = TRANSMIT_IDLE; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块 -// 参数说明 *buff 需要写入数据的首地址 -// 参数说明 length 需要写入数据的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_data(const uint8 *buff, uint16 length) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - wifi_transmit_state = TRANSMIT_WRITE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - spi_write_8bit_array(WIFI_SPI_INDEX, buff, length); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_spi_send_done(); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_data_multi(wifi_spi_send_multi_struct *multi_buffer) -{ - uint8 i; - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - wifi_transmit_state = TRANSMIT_WRITE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - - for(i = 0; i < WIFI_SPI_MAX_MULTI; i++) - { - if(NULL != multi_buffer->source[i]) spi_write_8bit_array(WIFI_SPI_INDEX, multi_buffer->source[i], multi_buffer->length[i]); - } - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_spi_send_done(); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 接收模块发送的数据 -// 参数说明 *buff 接收数组的缓冲区首地址 -// 参数说明 length 需要接收的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_data(uint8 *buff, uint16 length) -{ - spi_read_8bit_array(WIFI_SPI_INDEX, buff, length); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送命令到模块 -// 参数说明 *str 命令字符串首地址 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_command(const char *str) -{ - uint8 state = 0; - uint16 send_length; - uint16 wait_time = 0; - - // 请求发送数据 - send_length = (uint16)strlen(str); - - // 等待传输进入空闲 - while(TRANSMIT_IDLE != wifi_transmit_state); - - // 如果没有进入发送状态则重新请求发送数据 - while(BUFFER_WRITE != wifi_buffer_state) - { - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - while(!wifi_spi_ack_flag) - { - wait_time++; - if((WAIT_TIME_OUT / 4) <= wait_time) - { - state = 1; - wifi_spi_init_flag = 0; // 模块已断开 - break; - } - system_delay_ms(1); - } - - if(1 == state) + system_delay_us(10); + time++; + if(wait_time <= time) { break; } } - - wifi_buffer_state = BUFFER_IDLE; - - if(0 == state) // 通讯未超时 - { - wifi_spi_send_remain_length = send_length; - // 发送消息 - wifi_spi_send_data((const uint8 *)str, send_length); - } + return (wait_time <= time); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 检查模块状态并读取模块发送的数据 -// 参数说明 void -// @return void -// Sample usage: +// 函数简介 写入数据到WIFI SPI +// 参数说明 *buffer1 第一组需要发送的数据缓冲区地址 +// 参数说明 length1 第一组数据长度 +// 参数说明 *buffer2 第二组需要发送的数据缓冲区地址 +// 参数说明 length2 第二组数据长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -void wifi_spi_check_state_read_buffer(void) +static void wifi_spi_write (const uint8 *buffer1, uint16 length1, const uint8 *buffer2, uint16 length2) { - uint16 wifi_spi_receive_length; // 本次接收到的数据数量 - uint8 wifi_spi_receive_buffer[WIFI_SPI_WRITE_MAX]; - - // 查询WIFI模块的状态 - wifi_buffer_state = wifi_spi_read_state(&wifi_spi_receive_length); - - // 如果需要读取WIFI模块数据,则保存需要读取的长度 - if(BUFFER_READ == wifi_buffer_state) + gpio_low(WIFI_SPI_CS_PIN); + if(NULL != buffer1) { - wifi_spi_receive_start(); - do - { - if(wifi_spi_receive_length > WIFI_SPI_WRITE_MAX) - { - wifi_spi_receive_data((uint8 *)wifi_spi_receive_buffer, WIFI_SPI_WRITE_MAX); - fifo_write_buffer(&wifi_spi_fifo, wifi_spi_receive_buffer, WIFI_SPI_WRITE_MAX); // 存入 FIFO - wifi_spi_receive_length = wifi_spi_receive_length - WIFI_SPI_WRITE_MAX; - } - else - { - wifi_spi_receive_data((uint8 *)wifi_spi_receive_buffer, wifi_spi_receive_length); - fifo_write_buffer(&wifi_spi_fifo, wifi_spi_receive_buffer, wifi_spi_receive_length); // 存入 FIFO - wifi_spi_receive_length = 0; - } - }while(wifi_spi_receive_length > 0); - wifi_spi_receive_done(); + spi_write_8bit_array(WIFI_SPI_INDEX, buffer1, length1); } - else if(BUFFER_IDLE == wifi_buffer_state) + if(NULL != buffer2) { - // 如果模块内部缓冲区状态为空闲,则传输状态也设置为空闲 - wifi_transmit_state = TRANSMIT_IDLE; + spi_write_8bit_array(WIFI_SPI_INDEX, buffer2, length2); } + gpio_high(WIFI_SPI_CS_PIN); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块 -// 参数说明 *buff 需要发送的数据首地址 -// 参数说明 length 需要发送的长度 -// @return uint32 剩余未发送长度 -// Sample usage: +// 函数简介 WIFI SPI 发送与接收同时进行(命令收发) +// 参数说明 *packets 发送与接收的地址 +// 参数说明 length 需要接收的长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_write_data(const uint8 *buff, uint32 length) +static void wifi_spi_transfer_command (wifi_spi_packets_struct *packets, uint16 length) { - uint16 send_length; - uint32 wait_time; + gpio_low(WIFI_SPI_CS_PIN); - // 记录需要发送的长度 - wifi_spi_send_remain_length = length; - - while(wifi_spi_send_remain_length) + spi_transfer_8bit(WIFI_SPI_INDEX, (uint8 *)&(packets->head), (uint8 *)&(packets->head), sizeof(wifi_spi_head_struct)); + + if(length) { - send_length = (uint16)func_limit_ab(wifi_spi_send_remain_length, 1, WIFI_SPI_WRITE_MAX); - - // 请求发送数据 - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - - // 最长等待5秒 - wait_time = 5000; - while(!wifi_spi_ack_flag) - { - wait_time--; - if(0 == wait_time) break; - system_delay_ms(1); - } - - if(BUFFER_WRITE == wifi_buffer_state) - { - // 发送消息 - wifi_spi_send_data(buff, send_length); - buff += send_length; - wifi_spi_send_remain_length -= send_length; - wifi_buffer_state = BUFFER_IDLE; - } - else - { - break; - } + spi_transfer_8bit(WIFI_SPI_INDEX, (const uint8 *)(packets->buffer), packets->buffer, length); } - - return wifi_spi_send_remain_length; + + gpio_high(WIFI_SPI_CS_PIN); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// @return uint32 剩余未发送长度 -// Sample usage: 发送数据总长度不能超过4092个 +// 函数简介 WIFI SPI 发送与接收同时进行(数据收发) +// 参数说明 *write_data 发送的数据缓冲区地址 +// 参数说明 *read_data 接收到的数据的存储地址 +// 参数说明 length 需要接收的长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_write_data_multi(wifi_spi_send_multi_struct *multi_buffer) +static void wifi_spi_transfer_data (const uint8 *write_data, wifi_spi_packets_struct *read_data, uint16 length) { - uint16 send_length; - uint32 wait_time; + gpio_low(WIFI_SPI_CS_PIN); - // 记录需要发送的长度 - send_length = multi_buffer->length[0] + multi_buffer->length[1] + multi_buffer->length[2] + multi_buffer->length[3] + multi_buffer->length[4] + multi_buffer->length[5] + multi_buffer->length[6] + multi_buffer->length[7]; + read_data->head.command = WIFI_SPI_DATA; + read_data->head.length = length; - if(WIFI_SPI_WRITE_MAX >= send_length) + spi_transfer_8bit(WIFI_SPI_INDEX, (uint8 *)&(read_data->head), (uint8 *)&(read_data->head), sizeof(wifi_spi_head_struct)); + + if(WIFI_SPI_RECVIVE_SIZE < length) { - // 请求发送数据 - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - - // 最长等待5秒 - wait_time = 5000; - while(!wifi_spi_ack_flag) - { - wait_time--; - if(0 == wait_time) break; - system_delay_ms(1); - } - - if(BUFFER_WRITE == wifi_buffer_state) - { - // 发送消息 - wifi_spi_send_data_multi(multi_buffer); - send_length = 0; - wifi_buffer_state = BUFFER_IDLE; - } + spi_transfer_8bit(WIFI_SPI_INDEX, write_data, read_data->buffer, WIFI_SPI_RECVIVE_SIZE); + spi_write_8bit_array(WIFI_SPI_INDEX, &write_data[WIFI_SPI_RECVIVE_SIZE], length - WIFI_SPI_RECVIVE_SIZE); } - - return send_length; + else + { + // 将需要发送的数据拷贝到读取缓冲区,避免出现write_data越界访问 + memcpy(read_data->buffer, write_data, length); + spi_transfer_8bit(WIFI_SPI_INDEX, read_data->buffer, read_data->buffer, WIFI_SPI_RECVIVE_SIZE); + } + gpio_high(WIFI_SPI_CS_PIN); } -//-------------------------------------------------------------------------------------------------- -// 函数简介 等待模块响应 -// 参数说明 *wait_buffer 等待的响应的字符串 -// 参数说明 timeout 超时时间 -// 返回参数 uint8 0:模块响应指定数据 1:模块未响应指定数据或超时 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_wait_ack (char *wait_buffer, uint32 timeout) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 参数设置 +// 参数说明 command 命令类型 +// 参数说明 *buffer 参数地址 +// 参数说明 length 参数长度 +// 参数说明 wait_time 最大等待时间 单位100微妙 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_set_parameter (wifi_spi_packets_command_enum command, uint8 *buffer, uint16 length, uint32 wait_time) { - uint8 return_state = 1; - char receiver_buffer[8] = {0, 0, 0, 0, 0, 0, 0, 0}; - uint32 receiver_len = 8; - + uint8 return_state; + wifi_spi_head_struct head; + return_state = 1; do { - system_delay_ms(1); - // 判断接收缓冲区内是否有需要响应的指定数据 如果有 则跳出循环并且返回0 - receiver_len = 8; - fifo_read_tail_buffer(&wifi_spi_fifo, (uint8 *)receiver_buffer, &receiver_len, FIFO_READ_ONLY); + head.command = command; + head.length = length; + + // 等待从机准备就绪 + if(wifi_spi_wait_idle(wait_time)) + { + break; + } - if(strstr(receiver_buffer, wait_buffer)) + wifi_spi_write(&head.command, sizeof(wifi_spi_head_struct), buffer, length); + if(wifi_spi_wait_idle(wait_time)) + { + break; + } + // 接收应答信号 + + head.command = WIFI_SPI_DATA; + head.length = 0; + wifi_spi_transfer_command((wifi_spi_packets_struct *)&head, head.length); + system_delay_us(20); + if(WIFI_SPI_REPLY_OK == head.command) { return_state = 0; - break; } - else if(strstr(receiver_buffer, "ERROR") || strstr(receiver_buffer, "busy")) - { - // 如果接收到报错或者模块忙 则跳出循环并且返回1 - return_state = 1; - break; - } - }while(timeout --); + }while(0); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 清除WiFi接收缓冲区内容 -// 参数说明 void -// 返回参数 void -// 使用示例 wifi_spi_clear_receive_buffer(); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static void wifi_spi_clear_receive_buffer (void) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 模块信息获取 +// 参数说明 command 命令类型 +// 参数说明 *buffer 保存接收到的参数地址 +// 参数说明 wait_time 最大等待时间 单位100微妙 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_parameter (wifi_spi_packets_command_enum command, wifi_spi_packets_struct *read_data, uint32 wait_time) { - // 清空WiFi接收缓冲区 - fifo_clear(&wifi_spi_fifo); -} + uint8 return_state; -//-------------------------------------------------------------------------------------------------- -// 函数简介 模块数据解析 -// 参数说明 *target_buffer 目标存放地址指针 字符串数组 -// 参数说明 *origin_buffer 数据来源地址指针 字符串数组 -// 参数说明 start_char 起始提取字节 例如从 "1234" 中从 '2' 开始提取 就应该填入 '2' -// 参数说明 end_char 结束提取字节 例如从 "1234" 中在 '4' 结束提取 就应该填入 '\0'(0x00 空字符 一般是字符串结尾) -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_data_parse(wifi_spi_information.mac, wifi_spi_receive_buffer, '"', '"'); // 调用获取本机mac地址后,调用此函数提取mac地址 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char start_char, char end_char) -{ - uint8 return_state = 0; - char *location1; - char *location2; - location1 = strchr((char *)origin_buffer, start_char); - if(location1) + return_state = 1; + do { - location1 ++; - location2 = strchr(location1, end_char); - if(location2) + // 等待从机准备就绪 + if(wifi_spi_wait_idle(wait_time)) { - memcpy(target_buffer, location1, location2-location1); + break; } - else + read_data->head.command = command; + wifi_spi_write(&(read_data->head.command), WIFI_SPI_RECVIVE_SIZE, NULL, 0); + + if(wifi_spi_wait_idle(wait_time)) { - return_state = 1; + break; } - } - else - { - return_state = 1; - } + read_data->head.command = WIFI_SPI_DATA; + read_data->head.length = 0; + wifi_spi_transfer_command(read_data, WIFI_SPI_RECVIVE_SIZE); + return_state = 0; + }while(0); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 查看模块版本信息 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_get_version(); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 固件版本获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,固件版本信息以字符串形式保存在wifi_spi_version数组中 +//------------------------------------------------------------------------------------------------------------------- static uint8 wifi_spi_get_version (void) { - char *location1; - uint8 return_state = 0; - uint8 receiver_buffer[256]; - uint32 receiver_len = 256; + uint8 return_state; + wifi_spi_packets_struct temp_packets; - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+GMR\r\n"); - do + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_VERSION, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_VERSION == temp_packets.head.command)) { - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - location1 = strrchr((char *)receiver_buffer, ':'); - if(wifi_spi_data_parse(wifi_spi_information.version, (uint8 *)location1, ':', '(')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - + memcpy(wifi_spi_version, temp_packets.buffer, temp_packets.head.length); + } return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 模块回显设置 -// 参数说明 model 0:关闭模块的回写功能 其他:开启模块回写 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_echo_set("1");//开启模块回写功能 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_echo_set (char *model) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI MAC地址获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,MAC地址信息以字符串形式保存在wifi_spi_mac_addr数组中 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_mac_addr (void) { - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - if('1' == *model) + uint8 return_state; + wifi_spi_packets_struct temp_packets; + + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_MAC_ADDR, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_MAC_ADDR == temp_packets.head.command)) { - wifi_spi_send_command("ATE1\r\n"); + memcpy(wifi_spi_mac_addr, temp_packets.buffer, temp_packets.head.length); + } + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI IP地址与端口号获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 +// 需要在连接Socket之后调用此函数才能正常获取信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_ip_addr_port (void) +{ + uint8 return_state; + wifi_spi_packets_struct temp_packets; + + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_IP_ADDR, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_IP_ADDR == temp_packets.head.command)) + { + memcpy(wifi_spi_ip_addr_port, temp_packets.buffer, temp_packets.head.length); + } + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 设置连接的WiFi信息并尝试连接WiFi +// 参数说明 *wifi_ssid WIFI名称 +// 参数说明 *pass_word WIFI密码 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_wifi_connect("SEEKFREE", "SEEKFREE123"); +// 备注信息 wifi_spi_wifi_connect("SEEKFREE", NULL); // 连接没有密码的WIFI热点 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_wifi_connect (char *wifi_ssid, char *pass_word) +{ + uint8 return_state; + uint8 temp_buffer[64]; + uint16 length; + + if(NULL != pass_word) + { + // WIFI热点有密码发送热点名称与密码 + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n%s\r\n", wifi_ssid, pass_word); } else { - wifi_spi_send_command("ATE0\r\n"); + // WIFI热点没有密码只需要发送热点名称 + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n", wifi_ssid); } - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + return_state = wifi_spi_set_parameter(WIFI_SPI_SET_WIFI_INFORMATION, temp_buffer, length, WIFI_CONNECT_TIME_OUT); + + // 本机IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 + wifi_spi_get_ip_addr_port(); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块自身 的 MAC 地址 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_mac()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_mac (void) -{ - uint8 return_state = 0; - uint8 receiver_buffer[64]; - uint32 receiver_len = 64; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPAPMAC?\r\n"); - do - { - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - if(wifi_spi_data_parse(wifi_spi_information.mac, receiver_buffer, '"', '"')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块或者目标WIFI 的 IP 地址(取决于模块当前的工作模式) -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_ip()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_ip (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_STATION == wifi_spi_information.mode) - { - wifi_spi_send_command("AT+CIPSTA?\r\n"); - } - else if(WIFI_SPI_SOFTAP == wifi_spi_information.mode) - { - wifi_spi_send_command("AT+CIPAP?\r\n"); - } - - do - { - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - uint8 receiver_buffer[128]; - uint32 receiver_len = 128; - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - if(wifi_spi_data_parse(wifi_spi_information.local_ip, receiver_buffer, '"', '"')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块的相关信息 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_information()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_information (void) -{ - uint8 return_state = 0; - do - { - // 获取模块版本号 - if(wifi_spi_get_version()) - { - return_state = 1; - break; - } - // 获取模块IP地址 - if(wifi_spi_get_ip()) - { - return_state = 1; - break; - } - // 获取模块MAC信息 - if(wifi_spi_get_mac()) - { - return_state = 1; - break; - } - memcpy(wifi_spi_information.local_port, "no port", 7); - }while(0); - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 连接 WiFi -// 参数说明 wifi_ssid WiFi名称 -// 参数说明 pass_word WiFi密码 -// 参数说明 model 0:查询WiFi连接情况 其他:连接WiFi -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_get_or_connect_wifi("WiFi_name", "Pass_word", 1); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_wifi (char *wifi_ssid, char *pass_word) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SOFTAP == wifi_spi_information.mode) - { - sprintf(temp, "AT+CWSAP=\"%s\",\"%s\",5,3\r\n", wifi_ssid, pass_word); - wifi_spi_send_command(temp); - } - else - { - sprintf(temp, "AT+CWJAP=\"%s\",\"%s\"\r\n", wifi_ssid, pass_word); - wifi_spi_send_command(temp); - } - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 上电是否自动连接WiFi -// 参数说明 model 0:上电不自动连接wifi 其他:上电自动连接wifi -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_auto_connect_wifi(0); //上电不自动连接wifi -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_auto_connect_wifi (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CWAUTOCONN=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置连接模式 -// 参数说明 model 0: 单连接模式 1:多连接模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_connect_model("1"); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_connect_model (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPMUX=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置传输模式 -// 参数说明 model – 0: 普通传输模式 IP断开后不重新连接 -// – 1: Wi-Fi 透传接收模式,仅支持 TCP 单连接、UDP 固定通信对端、SSL 单连接的情况 IP断开后会不断尝试重新连接 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_transfer_model("1"); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_transfer_model (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPMODE=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置模块模式 (Station/SoftAP/Station+SoftAP) -// 参数说明 state 0:无 Wi-Fi 模式,并且关闭 Wi-Fi RF----1: Station 模式----2: SoftAP 模式----3: SoftAP+Station 模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_model("1"); +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 设置连接的Socket信息并尝试连接Socket +// 参数说明 *transport_type 传输类型 +// 参数说明 *ip_addr IP地址 +// 参数说明 *port 目标端口号 +// 参数说明 *local_port 本机端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_socket_connect("TCP", "192.168.2.5", "8080", "6060"); // 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_set_model (wifi_spi_mode_enum mode) +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_socket_connect (char *transport_type, char *ip_addr, char *port, char *local_port) { - uint8 return_state = 0; + uint8 return_state; + uint8 temp_buffer[41]; + uint16 length; + + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n%s\r\n%s\r\n%s\r\n", transport_type, ip_addr, port, local_port); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + return_state = wifi_spi_set_parameter(WIFI_SPI_SET_SOCKET_INFORMATION, temp_buffer, length, SOCKET_CONNECT_TIME_OUT); - if(WIFI_SPI_SOFTAP == mode) - { - wifi_spi_send_command("AT+CWMODE=2\r\n"); - } - else - { - wifi_spi_send_command("AT+CWMODE=1\r\n"); - } - // 设置模块工作模式 - wifi_spi_information.mode = mode; - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + // 本机IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 + wifi_spi_get_ip_addr_port(); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 关闭睡眠模式 -// 参数说明 mode -// 返回参数 uint8 0:成功 1:失败 +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 断开Socket连接 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_socket_disconnect(); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_socket_disconnect (void) +{ + wifi_spi_packets_struct temp_packets; + + return wifi_spi_get_parameter(WIFI_SPI_CLOSE_SOCKET, &temp_packets, OTHER_TIME_OUT); +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 软复位 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 // 使用示例 // 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_close_sleep_model (void) +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_reset (void) { - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+SLEEP=0\r\n"); - // 设置模块工作模式 - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 断开与wifi的连接 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_disconnected_wifi(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_disconnected_wifi (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CWQAP\r\n"); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 进入打开透传模式 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_entry_serianet(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_entry_serianet (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPSEND\r\n"); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 退出透传模式 -// 参数说明 model 0:关闭透传模式 其他:开启透传模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_exit_serianet(1); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_exit_serianet (void) -{ - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - system_delay_ms(20); - wifi_spi_send_command("+++"); - system_delay_ms(1000); - - return 0; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 建立TCP连接 -// 参数说明 ip 远端 IPv4 地址、IPv6 地址,或域名 -// 参数说明 port 远端端口值 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_connect_tcp_servers("192.168.101.110", "8080"); -// 备注信息 如果总是连接不上电脑的TCP服务器 可以尝试使用网线连接电脑 -// 如果是使用WiFi连接 可能会导致模块连接TCP服务器等待较长时间 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_connect_tcp_servers (char *ip, char *port, wifi_spi_transfer_mode_enum mode) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + uint8 return_state; + wifi_spi_head_struct head; + return_state = 1; do { - if(wifi_spi_set_connect_model("0")) + head.command = WIFI_SPI_RESET; + head.length = 0xA5A5; + return_state = wifi_spi_wait_idle(OTHER_TIME_OUT); + if(return_state) { - return_state = 1; break; } + wifi_spi_write(&head.command, sizeof(wifi_spi_head_struct), NULL, 0); + }while(0); + + return return_state; +} - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPSTARTEX=\"TCP\",\"%s\",%s\r\n", ip, port); - wifi_spi_send_command(temp); - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI UDP模式时立即发送函数 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 在UDP模式下模块收到数据后会等待2毫秒,2毫秒后未收到数据则将数据通过socket发送到网络,如果希望立即发送则在数据传输完毕后调用此函数 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_udp_send_now (void) +{ + uint8 return_state = 1; + wifi_spi_packets_struct temp_packets; + + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + do { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - // 设置传输模式 - if(wifi_spi_set_transfer_model(WIFI_SPI_COMMAND == mode ? "0" : "1")) - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPSTATE?\r\n"); - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - else - { - uint8 receiver_buffer[128]; - uint32 receiver_len = 128; - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - char* buffer_index = (char *)receiver_buffer; - char* end_index; - - buffer_index += 22; - buffer_index += strlen(ip); - buffer_index += strlen(port); - end_index = strchr(buffer_index, ','); - - memcpy(wifi_spi_information.local_port, " ", 7); - memcpy(wifi_spi_information.local_port, buffer_index, (end_index - buffer_index)); - } - - wifi_spi_information.connect_state = WIFI_SPI_SERVER_ON; - wifi_spi_information.connect_mode = WIFI_SPI_TCP_CLIENT; - wifi_spi_information.transfer_mode = mode; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SERIANET == mode) // 透传模式下直接开启透传 - { - if(wifi_spi_entry_serianet()) + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) { - return_state = 1; break; } - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 建立UDP连接 -// 参数说明 *ip 远端 IPv4 地址、IPv6 地址 或域名 字符串形式 -// 参数说明 *port 远端端口值 字符串形式 -// 参数说明 *local_port 远端 IPv4 地址、IPv6 地址 或域名 字符串形式 -// 参数说明 mode 模块数据通信模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_connect_udp_client("192.168.101.110", "8080", "8080", WIFI_SPI_COMMAND); -// 备注信息 自动分配ID -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_connect_udp_client (char *ip, char *port, char *local_port, wifi_spi_transfer_mode_enum mode) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - do - { - if(wifi_spi_set_connect_model("0")) - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + // 立即开始socket发送 + temp_packets.head.command = WIFI_SPI_UDP_SEND; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + + // 等待应答信号 + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + + // 接收应答信号 + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, temp_packets.head.length); + + if(WIFI_SPI_REPLY_OK == temp_packets.head.command) + { + return_state = 0; + } + + }while(0); - sprintf(temp, "AT+CIPSTARTEX=\"UDP\",\"%s\",%s,%s\r\n", ip, port, local_port); - wifi_spi_send_command(temp); + // 将通讯状态设置为空闲 + wifi_spi_mutex = WIFI_SPI_IDLE; + } + + return return_state; +} - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 数据块发送函数并同步接收数据 +// 参数说明 *buff 需要发送的数据地址 +// 参数说明 length 发送长度 +// 返回参数 uint32 剩余未发送的长度 +// 使用示例 wifi_spi_send_buffer(buffer, 100); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +uint32 wifi_spi_send_buffer (const uint8 *buffer, uint32 length) +{ + uint16 send_length; + wifi_spi_packets_struct temp_packets; + + // 检查WIFI SPI状态,如果在其他中断或者线程中已经发起了通讯,则本次不能发送数据 + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + + while(length) { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_spi_set_transfer_model(WIFI_SPI_COMMAND == mode ? "0" : "1")) // 设置传输模式 - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SERIANET == mode) // 透传模式下直接开启透传 - { - if(wifi_spi_entry_serianet()) + send_length = length > WIFI_SPI_TRANSFER_SIZE ? (uint16)WIFI_SPI_TRANSFER_SIZE : (uint16)length; + + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) { - return_state = 1; break; } - } - memcpy(wifi_spi_information.local_port, " ", 7); - memcpy(wifi_spi_information.local_port, local_port, strlen(local_port)); - wifi_spi_information.connect_state = WIFI_SPI_SERVER_ON; - wifi_spi_information.connect_mode = WIFI_SPI_UDP_CLIENT; - wifi_spi_information.transfer_mode = mode; - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 断开连接 TCP Server 使用本接口将会断开所有连接 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_disconnect_link(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_disconnect_link (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - do - { - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - wifi_spi_send_command("AT+CIPCLOSE=5\r\n"); - } - else - { - wifi_spi_send_command("AT+CIPCLOSE\r\n"); - } - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送字节函数 -// 参数说明 data 需要发送的数据 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_byte(0xa5); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_byte (uint8 data) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - send_length = 1; - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data(&data, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else - { - send_length = (uint16)wifi_spi_write_data(&data, send_length); - } - } - } - - return send_length; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送缓冲区函数 -// 参数说明 buff 需要发送的数据地址 -// 参数说明 len 发送长度 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_buffer("123", 3); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 len) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - while(len) - { - if((WIFI_SPI_WRITE_MAX * 2) < len) send_length = WIFI_SPI_WRITE_MAX * 2; - else - { - send_length = (uint16)len; - } - len -= send_length; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data(buff, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } - buff += send_length; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else - { - len = wifi_spi_write_data(buff, len); - } - } - } - - return len; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送缓冲区函数(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 -// 备注信息 需要发送多个数组时,采用此函数可以极大的降低通讯时间,发送数据总长度不能超过4092 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_buffer_multi (wifi_spi_send_multi_struct *multi_buffer) -{ - uint8 i; - uint16 remain_length; - - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - for(i = 0; i < WIFI_SPI_MAX_MULTI; i++) - { - if(multi_buffer->source[i]) wifi_spi_send_buffer(multi_buffer->source[i], multi_buffer->length[i]); - } - } - else - { - remain_length = (uint16)wifi_spi_write_data_multi(multi_buffer); - } - } - } - - return remain_length; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送字符串函数 -// 参数说明 *str 需要发送的数据 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_string("123"); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_string (const char *str) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - send_length = (uint16)strlen(str); - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data((uint8 *)str, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } + wifi_spi_transfer_data(buffer, &temp_packets, send_length); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) { - send_length = (uint16)wifi_spi_write_data((uint8 *)str, send_length); + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + + length -= send_length; + buffer += send_length; + } + + // 检查最后一次的接收是否将所有的数据都接收完毕 + while(WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) + { + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + + // 继续读取模块剩余数据 + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } } } + wifi_spi_mutex = WIFI_SPI_IDLE; } - - return send_length; + return length; } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi 模块数据接收函数 -// 参数说明 buffer 接收数据的存放地址 -// 参数说明 len 数组长度,可直接填写或者使用sizeof求得 -// 返回参数 uint32 返回实际接收到的数据长度 -// 使用示例 uint8 test_buffer[256]; wifi_spi_read_buffer(&test_buffer[0], sizeof(test_buffer)); +// 函数简介 WIFI SPI 读取缓冲区 +// 参数说明 *buff 接收缓冲区 +// 参数说明 length 读取数据长度 +// 返回参数 uint32 实际读取数据长度 +// 使用示例 wifi_spi_read_buffer(buffer, 100); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 len) +uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 length) { - fifo_read_buffer(&wifi_spi_fifo, buffer, &len, FIFO_READ_AND_CLEAN); - return len; + zf_assert(NULL != buffer); + uint32 data_len = length; + +#if(1 == WIFI_SPI_READ_TRANSFER) + + wifi_spi_packets_struct temp_packets; + // 检查WIFI SPI状态,如果在其他中断或者线程中已经发起了通讯,则本次不能发送数据 + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + + // 发起通讯查看模块内是否有数据未读取 + do + { + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + }while(WIFI_SPI_REPLY_DATA_START == temp_packets.head.command); + wifi_spi_mutex = WIFI_SPI_IDLE; + } +#endif + + fifo_read_buffer(&wifi_spi_fifo, buffer, &data_len, FIFO_READ_AND_CLEAN); + return data_len; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 wifi spi handshake中断回调函数 -// 参数说明 void -// 返回参数 void -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -void wifi_spi_callback (void) -{ - wifi_spi_check_state_read_buffer(); - wifi_spi_ack_flag = 1; // ACK标志位置1 -} - - //------------------------------------------------------------------------------------------------------------------- // 函数简介 WiFi 模块初始化 // 参数说明 *wifi_ssid 目标连接的 WiFi 的名称 字符串形式 // 参数说明 *pass_word 目标连接的 WiFi 的密码 字符串形式 -// 参数说明 wifi_mode 模块的工作模式 参照 zf_device_wireless_spi.h 中 wifi_spi_mode_enum 枚举 // 返回参数 uint8 模块初始化状态 0-成功 1-错误 -// 使用示例 wifi_spi_init("SEEKFREE_2.4G", "SEEKFREEV2", WIFI_UART_STATION); -// 备注信息 初始化会首先设置串口配置,之后会对模块进行基本参数配置 -// 具体的配置信息可以在 zf_device_wireless_spi.h 文件中修改 +// 使用示例 wifi_spi_init("SEEKFREE", "SEEKFREE123"); +// 备注信息 wifi_spi_init("SEEKFREE", NULL); // 连接没有密码的WIFI热点 //------------------------------------------------------------------------------------------------------------------- -uint8 wifi_spi_init (char *wifi_ssid, char *pass_word, wifi_spi_mode_enum wifi_mode) +uint8 wifi_spi_init (char *wifi_ssid, char *pass_word) { uint8 return_state = 0; - uint32 temp_isr; - - spi_init(WIFI_SPI_INDEX, SPI_MODE0, WIFI_SPI_SPEED, WIFI_SPI_SCK_PIN, WIFI_SPI_MOSI_PIN, WIFI_SPI_MISO_PIN, SPI_CS_NULL);//硬件SPI初始化 - set_wireless_type(WIFI_SPI, wifi_spi_callback); - fifo_init(&wifi_spi_fifo, FIFO_DATA_8BIT, wifi_spi_buffer, WIFI_SPI_BUFFER_SIZE); + fifo_init(&wifi_spi_fifo, FIFO_DATA_8BIT, wifi_spi_buffer, WIFI_SPI_RECVIVE_FIFO_SIZE); + spi_init(WIFI_SPI_INDEX, SPI_MODE3, WIFI_SPI_SPEED, WIFI_SPI_SCK_PIN, WIFI_SPI_MOSI_PIN, WIFI_SPI_MISO_PIN, SPI_CS_NULL);//硬件SPI初始化 gpio_init(WIFI_SPI_CS_PIN, GPO, 1, GPO_PUSH_PULL); gpio_init(WIFI_SPI_RST_PIN, GPO, 1, GPO_PUSH_PULL); - - temp_isr = interrupt_global_disable(); - - exti_init(WIFI_SPI_INT_PIN, EXTI_TRIGGER_RISING); - + gpio_init(WIFI_SPI_INT_PIN, GPI, 0, GPI_PULL_DOWN); + + // 复位 gpio_set_level(WIFI_SPI_RST_PIN, 0); - system_delay_ms(50); + system_delay_ms(10); gpio_set_level(WIFI_SPI_RST_PIN, 1); - system_delay_ms(1000); + + // 等待模块初始化 + system_delay_ms(100); + wifi_spi_mutex = WIFI_SPI_IDLE; - exti_flag_clear(WIFI_SPI_INT_PIN); - - interrupt_global_enable(temp_isr); do { - if(wifi_spi_echo_set("0")) // 关闭模块回写 + // 固件版本信息以字符串形式保存在wifi_spi_version数组中 + return_state = wifi_spi_get_version(); + if(return_state) + { + break; + } + + // MAC地址信息以字符串形式保存在wifi_spi_mac_addr数组中 + wifi_spi_get_mac_addr(); + + + return_state = wifi_spi_wifi_connect(wifi_ssid, pass_word); + if(return_state) { - zf_log(0, "exit echo failed"); - return_state = 1; break; } - if(wifi_spi_auto_connect_wifi("0")) // 关闭自动连接 + #if(1 == WIFI_SPI_AUTO_CONNECT) + return_state = wifi_spi_socket_connect("TCP", WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT); + if(return_state) { - zf_log(0, "close auto connect failed"); - return_state = 1; break; } - - if(wifi_spi_set_model(wifi_mode)) // 设置运行模式 + #endif + + #if(2 == WIFI_SPI_AUTO_CONNECT) + return_state = wifi_spi_socket_connect("UDP", WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT); + if(return_state) { - zf_log(0, "set run mode failed"); - return_state = 1; break; } - - if(wifi_spi_close_sleep_model()) // 关闭睡眠模式 - { - zf_log(0, "set sleep mode failed"); - return_state = 1; - break; - } - - if(wifi_spi_set_wifi((char *)wifi_ssid, (char *)pass_word)) // 连接 wifi 或者开启热点 - { - zf_log(0, "wifi set failed"); - return_state = 1; - break; - } - - if(wifi_spi_get_information()) // 模块基本参数获取 - { - zf_log(0, "get module information failed"); - return_state = 1; - break; - } -#if WIFI_SPI_AUTO_CONNECT == 1 - if(wifi_spi_connect_tcp_servers(WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_SERIANET)) // 连接TCP服务器 - { - zf_log(0, "connect TCP server failed"); - return_state = 1; - break; - } -#endif -#if WIFI_SPI_AUTO_CONNECT == 2 - if(wifi_spi_connect_udp_client(WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT, WIFI_SPI_SERIANET)) // 建立UDP连接 - { - zf_log(0, "connect UDP server failed"); - return_state = 1; - break; - } -#endif - // 模块初始化成功 - wifi_spi_init_flag = 1; + #endif }while(0); - + return return_state; } diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_wifi_spi.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_wifi_spi.h index 5e5a025..24e7eb1 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_wifi_spi.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_wifi_spi.h @@ -24,13 +24,13 @@ * 文件名称 zf_device_wifi_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 * 日期 作者 备注 -* 2023-05-27 pudding first version +* 2024-01-18 SeekFree first version ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,128 +53,100 @@ #include "zf_common_typedef.h" + #define WIFI_SPI_INDEX (SPI_3 ) // 定义使用的SPI号 -#define WIFI_SPI_SPEED (30 * 1000 * 1000 ) // 硬件 SPI 速率 +#define WIFI_SPI_SPEED (50 * 1000 * 1000 ) // 硬件 SPI 速率 #define WIFI_SPI_SCK_PIN (SPI3_SCLK_P22_3 ) // 定义SPI_SCK引脚 #define WIFI_SPI_MOSI_PIN (SPI3_MOSI_P22_0 ) // 定义SPI_MOSI引脚 #define WIFI_SPI_MISO_PIN (SPI3_MISO_P22_1 ) // 定义SPI_MISO引脚 IPS没有MISO引脚,但是这里任然需要定义,在spi的初始化时需要使用 #define WIFI_SPI_CS_PIN (P22_2 ) // 定义SPI_CS引脚 采用软件CS引脚 -#define WIFI_SPI_INT_PIN (ERU_CH5_REQ1_P15_8) // 定义中断引脚 +#define WIFI_SPI_INT_PIN (P15_8 ) // 定义握手引脚 #define WIFI_SPI_RST_PIN (P23_1 ) // 定义复位引脚 - - -#define WIFI_SPI_BUFFER_SIZE (1024) // 定义SPI接收的缓冲区大小 -#define WIFI_SPI_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不连接 1-自动连接TCP服务器并进入透传模式 2-自动连接UDP服务器并进入透传模式 3:自动建立TCP服务器 - -#if (WIFI_SPI_AUTO_CONNECT > 2) + +#define WIFI_SPI_RECVIVE_FIFO_SIZE (1024) // 接收FIFO大小 +#define WIFI_SPI_READ_TRANSFER (1) // 在调用wifi_spi_read_buffer 是否尝试发起SPI通讯来检测模块内是否有数据需要读取 1:发起SPI通讯 0:不发起SPI通讯,仅读取FIFO + // 如果应用程序中没有任何的地方调用发送函数,则WIFI_SPI_READ_TRANSFER必须设置为1 + +#define WIFI_SPI_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不自动连接 1-自动连接TCP服务器 2-自动连接UDP + +#if (WIFI_SPI_AUTO_CONNECT > 2) #error "WIFI_SPI_AUTO_CONNECT 的值只能为 [0,1,2]" #else -#define WIFI_SPI_TARGET_IP "192.168.2.28" // 连接目标的 IP +#define WIFI_SPI_TARGET_IP "192.168.137.1" // 连接目标的 IP #define WIFI_SPI_TARGET_PORT "8080" // 连接目标的端口 -#define WIFI_SPI_LOCAL_PORT "8080" // 本机端口 +#define WIFI_SPI_LOCAL_PORT "6666" // 本机的端口 0:随机 可设置范围2048-65535 默认 6666 #endif -#define WIFI_SPI_MAX_MULTI (17) // 多地址发送,最大8个地址 -typedef enum -{ - BUFFER_IDLE, // 模块的缓冲区是空闲的 - BUFFER_READ, // 模块的缓冲区有数据需要读取 - BUFFER_WRITE, // 模块的缓冲区是可写的 -}wifi_spi_buffer_state_enum; +#define WIFI_SPI_RECVIVE_SIZE (32) // 每次SPI传输接收的字节数 不允许修改 +#define WIFI_SPI_TRANSFER_SIZE (4088) // 最大SPI传输接收的字节数 不允许修改 + + typedef enum -{ - TRANSMIT_IDLE, // 当前没有传输 - TRANSMIT_WRITE_REQUEST, // 给模块发送了一个传输请求 - TRANSMIT_READ_STATE, // 读取模块状态 - TRANSMIT_READ, // 正在读取模块内部数据 - TRANSMIT_WRITE, // 正在往模块写入数据 -}wifi_spi_transmit_state_enum; - -typedef enum -{ - WIFI_SPI_STATION, // 设备模式 - WIFI_SPI_SOFTAP, // AP模式 -}wifi_spi_mode_enum; - -typedef enum -{ - WIFI_SPI_COMMAND, // 使用命令的方式发送数据 - WIFI_SPI_SERIANET, // 使用透传的方式发送数据 -}wifi_spi_transfer_mode_enum; - -typedef enum -{ - WIFI_SPI_TCP_CLIENT, // 模块连接TCP服务器 - WIFI_SPI_TCP_SERVER, // 模块作为TCP服务器 - WIFI_SPI_UDP_CLIENT, // 模块启用UDP连接 -}wifi_spi_connect_mode_enum; - -typedef enum -{ - WIFI_SPI_SERVER_OFF, // 模块未连接服务器 - WIFI_SPI_SERVER_ON, // 模块已经连接服务器 -}wifi_spi_connect_state_enum; - -typedef enum -{ - WIFI_SPI_LINK_0, // 模块当前链接 0 - WIFI_SPI_LINK_1, // 模块当前链接 1 - WIFI_SPI_LINK_2, // 模块当前链接 2 - WIFI_SPI_LINK_3, // 模块当前链接 3 - WIFI_SPI_LINK_4, // 模块当前链接 4 -}wifi_spi_link_id_enum; - -typedef struct { - uint8 reserve; - uint8 cmd; - uint8 addr; - uint8 dummy; - uint8 magic; - uint8 sequence; - uint16 length; -}wifi_spi_buffer_struct; + // 主机发送的命令 + WIFI_SPI_INVALID1 = 0x00, // 无效数据包 + WIFI_SPI_RESET = 0x01, // 复位命令 + WIFI_SPI_DATA = 0x02, // 透传数据包 + WIFI_SPI_UDP_SEND = 0x03, // UDP下立即发送命令,默认SPI接收数据后2MS未收到数据自动发送数据 + WIFI_SPI_CLOSE_SOCKET = 0x04, // 断开连接 + + WIFI_SPI_SET_WIFI_INFORMATION = 0x10, // 设置WIFI信息命令 + WIFI_SPI_SET_SOCKET_INFORMATION = 0x11, // 设置SOCKET信息命令 + + WIFI_SPI_GET_VERSION = 0x20, // 获取模块版本 + WIFI_SPI_GET_MAC_ADDR = 0x21, // 获取模块MAC地址 + WIFI_SPI_GET_IP_ADDR = 0x22, // 获取模块IP地址 + + // 从机回传的命令 + WIFI_SPI_REPLY_OK = 0x80, // 从机应答的正确命令 + WIFI_SPI_REPLY_ERROR = 0x81, // 从机应答的错误命令 + + WIFI_SPI_REPLY_DATA_START = 0x90, // 从机回传的数据包,并且还有数据需要主机读取 + WIFI_SPI_REPLY_DATA_END = 0x91, // 从机回传的数据包,数据已读取完毕 + + WIFI_SPI_REPLY_VERSION = 0xA0, // 从机回复固件版本 + WIFI_SPI_REPLY_MAC_ADDR = 0xA1, // 从机回复本机MAC地址等信息 + WIFI_SPI_REPLY_IP_ADDR = 0xA2, // 从机回复本机IP地址、端口号 + WIFI_SPI_INVALID2 = 0xFF // 无效数据包 +}wifi_spi_packets_command_enum; + +typedef enum +{ + WIFI_SPI_IDLE, // 模块空闲,可以进行SPI通讯 + WIFI_SPI_BUSY, // 模块正忙,不可进行SPI通讯 +}wifi_spi_state_enum; + + +typedef struct +{ + uint8 command; // 命令字 + uint8 reserve; // 保留 + uint16 length; // 包有效长度 +}wifi_spi_head_struct; + + +typedef struct +{ + wifi_spi_head_struct head; // 帧头 + uint8 buffer[WIFI_SPI_RECVIVE_SIZE]; // 缓冲区 +}wifi_spi_packets_struct; + + +extern char wifi_spi_version[12]; // 固件版本 字符串 +extern char wifi_spi_mac_addr[20]; // 模块MAC地址 字符串 +extern char wifi_spi_ip_addr_port[25]; // IP地址与端口号 字符串 -typedef struct -{ - uint8 version[12]; // 固件版本 字符串形式 - uint8 mac[20]; // 本机 MAC 地址 字符串形式 - uint8 local_ip[17]; // 本机 IP 地址 字符串形式 - uint8 local_port[10]; // 本机端口号 字符串形式 - uint8 remote_ip[5][17]; // 远端 IP 地址 字符串形式 - wifi_spi_mode_enum mode; // WIFI 模式 - wifi_spi_transfer_mode_enum transfer_mode; // 当前传输模式 - wifi_spi_connect_mode_enum connect_mode; // 网络连接模式 - wifi_spi_connect_state_enum connect_state; // 服务器连接情况 -}wifi_spi_information_struct; +uint8 wifi_spi_wifi_connect (char *wifi_ssid, char *pass_word); +uint8 wifi_spi_socket_connect (char *transport_type, char *ip_addr, char *port, char *local_port); +uint8 wifi_spi_socket_disconnect (void); +uint8 wifi_spi_udp_send_now (void); +uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 length); +uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 length); -typedef struct -{ - uint8 *source[WIFI_SPI_MAX_MULTI]; - uint16 length[WIFI_SPI_MAX_MULTI]; -}wifi_spi_send_multi_struct; - -extern wifi_spi_information_struct wifi_spi_information; - - -uint8 wifi_spi_disconnected_wifi (void); // 断开 WIFI 连接 -uint8 wifi_spi_entry_serianet (void); // 打开透传模式 -uint8 wifi_spi_exit_serianet (void); // 关闭透传模式 - -uint8 wifi_spi_connect_tcp_servers (char *ip, char *port, wifi_spi_transfer_mode_enum mode); // 建立 TCP 连接 -uint8 wifi_spi_connect_udp_client (char *ip, char *port, char *local_port, wifi_spi_transfer_mode_enum mode); // 建立 UDP 传输 -uint8 wifi_spi_disconnect_link (void); // 断开连接 TCP Server 使用本接口将会断开所有连接 - -uint32 wifi_spi_send_byte (uint8 data); // WIFI 模块发送字节函数 -uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 length); // WIFI 模块发送缓冲区函数 -uint32 wifi_spi_send_buffer_multi (wifi_spi_send_multi_struct *multi_buffer); // WIFI 模块发送多缓冲区函数 -uint32 wifi_spi_send_string (const char *str); // WIFI 模块发送字符串函数 - -uint32 wifi_spi_read_buffer (uint8 *buff, uint32 len); // WIFI 模块数据接收函数 - -uint8 wifi_spi_init (char *wifi_ssid, char *pass_word, wifi_spi_mode_enum wifi_mode); // WIFI 模块初始化函数 +uint8 wifi_spi_init (char *wifi_ssid, char *pass_word); #endif + diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_wifi_uart.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_wifi_uart.c index 312dab7..ff728bb 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_wifi_uart.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_wifi_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_wifi_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -61,7 +61,7 @@ wifi_uart_information_struct wifi_uart_information; // 模块自身参数 -static fifo_obj_struct wifi_uart_fifo; +static fifo_struct wifi_uart_fifo; static uint8 wifi_uart_buffer[WIFI_UART_BUFFER_SIZE]; // 数据存放数组 static uint8 wifi_uart_data; diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_wifi_uart.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_wifi_uart.h index abcb253..3316b6f 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_wifi_uart.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_wifi_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_wifi_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_wireless_uart.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_wireless_uart.c index eac2867..91ec013 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_wireless_uart.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_wireless_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_wireless_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -53,7 +53,7 @@ #include "zf_device_type.h" #include "zf_device_wireless_uart.h" -static fifo_obj_struct wireless_uart_fifo; +static fifo_struct wireless_uart_fifo; static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; static uint8 wireless_uart_data = 0; diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_wireless_uart.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_wireless_uart.h index 2418545..a789ad0 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_wireless_uart.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_wireless_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_wireless_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -61,11 +61,11 @@ // 注意事项2:开启自动波特率务必连接RTS引脚 否则会开启失败。 // 注意事项3:模块自动波特率失败的话 可以尝试断电重启 -// 开启自动波特率务必阅读上面两条 注意事项 -// 开启自动波特率务必阅读上面两条 注意事项 -// 开启自动波特率务必阅读上面两条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 -// 0:关闭自动波特率 +// 0:关闭自动波特率 // 1:开启自动波特率 自动波特率的作用是修改 WIRELESS_UART_BAUD 之后不需要对模块进行配置 模块会自动设置为对应的波特率 #define WIRELESS_UART_AUTO_BAUD_RATE ( 1 ) diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_adc.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_adc.c index 9a262a1..06694d8 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_adc.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_adc.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_adc * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_adc.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_adc.h index 378b67e..f017c76 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_adc.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_adc.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_adc * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_delay.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_delay.c index 4ec533c..ae3e610 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_delay.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_delay.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_delay * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_delay.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_delay.h index e8d82ef..7b8b475 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_delay.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_delay.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_delay * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_dma.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_dma.c index f72f1d6..43bffbc 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_dma.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_dma.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_dma * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_dma.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_dma.h index 1ec555b..320d40c 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_dma.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_dma.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_dma * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_encoder.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_encoder.c index 6592198..0e0e0b9 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_encoder.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_encoder.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_encoder.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_encoder.h index 68d159f..e079122 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_encoder.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_encoder.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_exti.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_exti.c index 72c9a1f..31d270a 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_exti.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_exti.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_exti * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_exti.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_exti.h index 30f5ef6..b63f9ee 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_exti.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_exti.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_exti * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_flash.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_flash.c index f91f5a0..325cfed 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_flash.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_flash.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_flash * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_flash.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_flash.h index 912585a..e7425fd 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_flash.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_flash.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_flash * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_gpio.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_gpio.c index 5071114..a084353 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_gpio.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_gpio.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_gpio * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_gpio.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_gpio.h index 2b23be0..550fb8d 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_gpio.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_gpio.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_gpio * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_pit.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_pit.c index c4dc50d..5e03d38 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_pit.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_pit.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pit * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_pit.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_pit.h index 5461e05..66854b5 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_pit.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_pit.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pit * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_pwm.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_pwm.c index ad1059a..24d8d7a 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_pwm.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_pwm.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pwm * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_pwm.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_pwm.h index d6dce78..51948a4 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_pwm.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_pwm.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pwm * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_soft_iic.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_soft_iic.c index 9833b62..a349ec7 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_soft_iic.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_soft_iic.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_iic * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_soft_iic.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_soft_iic.h index a62b262..80db53b 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_soft_iic.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_soft_iic.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_iic * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_soft_spi.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_soft_spi.c index 292c60b..954fbe3 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_soft_spi.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_soft_spi.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_soft_spi.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_soft_spi.h index 6a9c207..62858de 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_soft_spi.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_soft_spi.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_spi.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_spi.c index 1b99196..f817dd9 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_spi.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_spi.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -920,7 +920,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 do { - IfxQspi_writeTransmitFifo(moudle, (uint8)(*write_buffer & 0xFF00) >> 8); // 将发送的数据写入缓冲区 + IfxQspi_writeTransmitFifo(moudle, (uint8)((*write_buffer & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 if(read_buffer != NULL) { diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_spi.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_spi.h index e73507e..d15589c 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_spi.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_spi.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_timer.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_timer.c index a953b92..e085d6e 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_timer.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_timer.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_timer * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_timer.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_timer.h index 3c86f58..1bb348f 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_timer.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_timer.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_timer * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_uart.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_uart.c index cd19782..fb89b55 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_uart.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_uart.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_uart.h index 8d1d111..cdc55ab 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_uart.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E12_cpu1_handles_interrupts_demo/user/isr.c b/Example/E12_cpu1_handles_interrupts_demo/user/isr.c index f81ccb2..a419ee6 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/user/isr.c +++ b/Example/E12_cpu1_handles_interrupts_demo/user/isr.c @@ -24,7 +24,7 @@ * 文件名称 isr * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -118,7 +118,7 @@ IFX_INTERRUPT(exti_ch1_ch5_isr, 0, EXTI_CH1_CH5_INT_PRIO) { exti_flag_clear(ERU_CH5_REQ1_P15_8); - wireless_module_spi_handler(); // SPI WIFI 中断回调函数 + } } diff --git a/Example/E13_dual_core_demo/libraries/doc/version.txt b/Example/E13_dual_core_demo/libraries/doc/version.txt index b841b50..d644136 100644 --- a/Example/E13_dual_core_demo/libraries/doc/version.txt +++ b/Example/E13_dual_core_demo/libraries/doc/version.txt @@ -1,3 +1,8 @@ +V3.2.6 + 更新逐飞助手接口函数 调用初始化时直接传参通信类 + 更新wifi SPI驱动文件 提高通信效率 + 更新GPS驱动文件,更名为GNSS,兼容普通定位模块及RTK + V3.2.5 修复延时函数初始化参数及中断向量表问题 V3.2.4 diff --git a/Example/E13_dual_core_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h b/Example/E13_dual_core_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h index 28ff689..371e6b6 100644 --- a/Example/E13_dual_core_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h +++ b/Example/E13_dual_core_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h @@ -34,7 +34,7 @@ /*------------------------------------------Configuration for IfxScu_cfg.h-------------------------------------------*/ /*********************************************************************************************************************/ /* External oscillator frequency in Hz */ -#define IFX_CFG_SCU_XTAL_FREQUENCY (20000000) /* Allowed values are: 16000000, 20000000 or 40000000 */ +#define IFX_CFG_SCU_XTAL_FREQUENCY (20000000) /* Allowed values are9p: 16000000, 20000000 or 40000000 */ /* PLL frequency in Hz */ #define IFX_CFG_SCU_PLL_FREQUENCY (200000000) /* Allowed values are: 80000000, 133000000, 160000000 * or 200000000 */ diff --git a/Example/E13_dual_core_demo/libraries/zf_common/zf_common_clock.c b/Example/E13_dual_core_demo/libraries/zf_common/zf_common_clock.c index 5023270..9872ea9 100644 --- a/Example/E13_dual_core_demo/libraries/zf_common/zf_common_clock.c +++ b/Example/E13_dual_core_demo/libraries/zf_common/zf_common_clock.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_clock * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_common/zf_common_clock.h b/Example/E13_dual_core_demo/libraries/zf_common/zf_common_clock.h index 9face65..2b50396 100644 --- a/Example/E13_dual_core_demo/libraries/zf_common/zf_common_clock.h +++ b/Example/E13_dual_core_demo/libraries/zf_common/zf_common_clock.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_clock * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_common/zf_common_debug.c b/Example/E13_dual_core_demo/libraries/zf_common/zf_common_debug.c index 52c623d..d680265 100644 --- a/Example/E13_dual_core_demo/libraries/zf_common/zf_common_debug.c +++ b/Example/E13_dual_core_demo/libraries/zf_common/zf_common_debug.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_debug * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -46,7 +46,7 @@ static volatile uint8 zf_debug_assert_enable = 1; #if DEBUG_UART_USE_INTERRUPT // 如果启用 debug uart 接收中断 uint8 debug_uart_buffer[DEBUG_RING_BUFFER_LEN]; // 数据存放数组 uint8 debug_uart_data; -fifo_obj_struct debug_uart_fifo; +fifo_struct debug_uart_fifo; #endif //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E13_dual_core_demo/libraries/zf_common/zf_common_debug.h b/Example/E13_dual_core_demo/libraries/zf_common/zf_common_debug.h index 881a297..4fb4d91 100644 --- a/Example/E13_dual_core_demo/libraries/zf_common/zf_common_debug.h +++ b/Example/E13_dual_core_demo/libraries/zf_common/zf_common_debug.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_debug * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_common/zf_common_fifo.c b/Example/E13_dual_core_demo/libraries/zf_common/zf_common_fifo.c index b010d3e..94f5133 100644 --- a/Example/E13_dual_core_demo/libraries/zf_common/zf_common_fifo.c +++ b/Example/E13_dual_core_demo/libraries/zf_common/zf_common_fifo.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_fifo * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -45,7 +45,7 @@ // 使用示例 fifo_head_offset(fifo, 1); // 备注信息 本函数在文件内部调用 用户不用关注 也不可修改 //------------------------------------------------------------------------------------------------------------------- -static void fifo_head_offset (fifo_obj_struct *fifo, uint32 offset) +static void fifo_head_offset (fifo_struct *fifo, uint32 offset) { fifo->head += offset; @@ -63,7 +63,7 @@ static void fifo_head_offset (fifo_obj_struct *fifo, uint32 offset) // 使用示例 fifo_end_offset(fifo, 1); // 备注信息 本函数在文件内部调用 用户不用关注 也不可修改 //------------------------------------------------------------------------------------------------------------------- -static void fifo_end_offset (fifo_obj_struct *fifo, uint32 offset) +static void fifo_end_offset (fifo_struct *fifo, uint32 offset) { fifo->end += offset; @@ -80,7 +80,7 @@ static void fifo_end_offset (fifo_obj_struct *fifo, uint32 offset) // 使用示例 fifo_clear(fifo); // 备注信息 清空当前 FIFO 对象的内存 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_clear (fifo_obj_struct *fifo) +fifo_state_enum fifo_clear (fifo_struct *fifo) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -113,7 +113,7 @@ fifo_state_enum fifo_clear (fifo_obj_struct *fifo) // 使用示例 uint32 len = fifo_used(fifo); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 fifo_used (fifo_obj_struct *fifo) +uint32 fifo_used (fifo_struct *fifo) { zf_assert(fifo != NULL); return (fifo->max - fifo->size); // 返回当前 FIFO 缓冲区中数据个数 @@ -127,7 +127,7 @@ uint32 fifo_used (fifo_obj_struct *fifo) // 使用示例 zf_log(fifo_write_element(&fifo, data) == FIFO_SUCCESS, "fifo_write_byte error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat) +fifo_state_enum fifo_write_element (fifo_struct *fifo, uint32 dat) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -171,7 +171,7 @@ fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat) // 使用示例 zf_log(fifo_write_buffer(&fifo, data, 32) == FIFO_SUCCESS, "fifo_write_buffer error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 length) +fifo_state_enum fifo_write_buffer (fifo_struct *fifo, void *dat, uint32 length) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -286,7 +286,7 @@ fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 leng // 使用示例 zf_log(fifo_read_element(&fifo, data, FIFO_READ_ONLY) == FIFO_SUCCESS, "fifo_read_byte error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operation_enum flag) +fifo_state_enum fifo_read_element (fifo_struct *fifo, void *dat, fifo_operation_enum flag) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -348,7 +348,7 @@ fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operat // 使用示例 zf_log(fifo_read_buffer(&fifo, data, &length, FIFO_READ_ONLY) == FIFO_SUCCESS, "fifo_read_buffer error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) +fifo_state_enum fifo_read_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) { zf_assert(NULL != fifo); zf_assert(NULL != length); @@ -447,7 +447,7 @@ fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *leng // 如果使用 FIFO_READ_AND_CLEAN 操作 将会丢弃所有数据并清空整个 FIFO // 如果使用 FIFO_READ_AND_CLEAN 操作 将会丢弃所有数据并清空整个 FIFO //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) +fifo_state_enum fifo_read_tail_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) { zf_assert(NULL != fifo); zf_assert(NULL != length); @@ -541,7 +541,7 @@ fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 // 使用示例 fifo_init(&user_fifo, user_buffer, 64); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_init (fifo_obj_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size) +fifo_state_enum fifo_init (fifo_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; diff --git a/Example/E13_dual_core_demo/libraries/zf_common/zf_common_fifo.h b/Example/E13_dual_core_demo/libraries/zf_common/zf_common_fifo.h index 5cc7668..901a913 100644 --- a/Example/E13_dual_core_demo/libraries/zf_common/zf_common_fifo.h +++ b/Example/E13_dual_core_demo/libraries/zf_common/zf_common_fifo.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_fifo * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -91,17 +91,17 @@ typedef struct uint32 end; // 缓存尾指针 总是指向非空缓存(缓存全空除外) uint32 size; // 缓存剩余大小 uint32 max; // 缓存总大小 -}fifo_obj_struct; +}fifo_struct; -fifo_state_enum fifo_clear (fifo_obj_struct *fifo); -uint32 fifo_used (fifo_obj_struct *fifo); +fifo_state_enum fifo_clear (fifo_struct *fifo); +uint32 fifo_used (fifo_struct *fifo); -fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat); -fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 length); -fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operation_enum flag); -fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); -fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); +fifo_state_enum fifo_write_element (fifo_struct *fifo, uint32 dat); +fifo_state_enum fifo_write_buffer (fifo_struct *fifo, void *dat, uint32 length); +fifo_state_enum fifo_read_element (fifo_struct *fifo, void *dat, fifo_operation_enum flag); +fifo_state_enum fifo_read_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); +fifo_state_enum fifo_read_tail_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); -fifo_state_enum fifo_init (fifo_obj_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size); +fifo_state_enum fifo_init (fifo_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size); #endif diff --git a/Example/E13_dual_core_demo/libraries/zf_common/zf_common_font.c b/Example/E13_dual_core_demo/libraries/zf_common/zf_common_font.c index c816f9d..ee1df09 100644 --- a/Example/E13_dual_core_demo/libraries/zf_common/zf_common_font.c +++ b/Example/E13_dual_core_demo/libraries/zf_common/zf_common_font.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_font * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_common/zf_common_font.h b/Example/E13_dual_core_demo/libraries/zf_common/zf_common_font.h index 24b8602..7531250 100644 --- a/Example/E13_dual_core_demo/libraries/zf_common/zf_common_font.h +++ b/Example/E13_dual_core_demo/libraries/zf_common/zf_common_font.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_font * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_common/zf_common_function.c b/Example/E13_dual_core_demo/libraries/zf_common/zf_common_function.c index d403fb5..acf2739 100644 --- a/Example/E13_dual_core_demo/libraries/zf_common/zf_common_function.c +++ b/Example/E13_dual_core_demo/libraries/zf_common/zf_common_function.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_function * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_common/zf_common_function.h b/Example/E13_dual_core_demo/libraries/zf_common/zf_common_function.h index f5683e1..101b58a 100644 --- a/Example/E13_dual_core_demo/libraries/zf_common/zf_common_function.h +++ b/Example/E13_dual_core_demo/libraries/zf_common/zf_common_function.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_function * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_common/zf_common_headfile.h b/Example/E13_dual_core_demo/libraries/zf_common/zf_common_headfile.h index aa06ef8..86762db 100644 --- a/Example/E13_dual_core_demo/libraries/zf_common/zf_common_headfile.h +++ b/Example/E13_dual_core_demo/libraries/zf_common/zf_common_headfile.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_headfile * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -82,7 +82,7 @@ //===================================================外接设备驱动层=================================================== #include "zf_device_absolute_encoder.h" #include "zf_device_bluetooth_ch9141.h" -#include "zf_device_gps_tau1201.h" +#include "zf_device_gnss.h" #include "zf_device_camera.h" #include "zf_device_dl1a.h" #include "zf_device_dl1b.h" @@ -108,6 +108,7 @@ //====================================================应用组件层==================================================== #include "seekfree_assistant.h" +#include "seekfree_assistant_interface.h" //====================================================应用组件层==================================================== //=====================================================用户层====================================================== diff --git a/Example/E13_dual_core_demo/libraries/zf_common/zf_common_interrupt.c b/Example/E13_dual_core_demo/libraries/zf_common/zf_common_interrupt.c index 61058b2..af12fe0 100644 --- a/Example/E13_dual_core_demo/libraries/zf_common/zf_common_interrupt.c +++ b/Example/E13_dual_core_demo/libraries/zf_common/zf_common_interrupt.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_interrupt * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_common/zf_common_interrupt.h b/Example/E13_dual_core_demo/libraries/zf_common/zf_common_interrupt.h index 99b0e53..f828423 100644 --- a/Example/E13_dual_core_demo/libraries/zf_common/zf_common_interrupt.h +++ b/Example/E13_dual_core_demo/libraries/zf_common/zf_common_interrupt.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_interrupt * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_common/zf_common_typedef.h b/Example/E13_dual_core_demo/libraries/zf_common/zf_common_typedef.h index bd09f30..9a07c92 100644 --- a/Example/E13_dual_core_demo/libraries/zf_common/zf_common_typedef.h +++ b/Example/E13_dual_core_demo/libraries/zf_common/zf_common_typedef.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_typedef * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_components/seekfree_assistant.c b/Example/E13_dual_core_demo/libraries/zf_components/seekfree_assistant.c index a196e10..0b7cb9d 100644 --- a/Example/E13_dual_core_demo/libraries/zf_components/seekfree_assistant.c +++ b/Example/E13_dual_core_demo/libraries/zf_components/seekfree_assistant.c @@ -1,49 +1,71 @@ /********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ -#include "zf_common_fifo.h" + +#include "zf_common_debug.h" + #include "seekfree_assistant.h" -seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 -static seekfree_assistant_camera_struct seekfree_assistant_camera_data; // 图像上位机协议数据 -static seekfree_assistant_camera_dot_struct seekfree_assistant_camera_dot_data; // 图像上位机打点协议数据 -static seekfree_assistant_camera_buffer_struct seekfree_assistant_camera_buffer; // 图像以及边界缓冲区信息 -static fifo_obj_struct seekfree_assistant_fifo; -static uint8 seekfree_assistant_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE]; // 数据存放数组 -float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 保存接收到的参数 -vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 参数更新标志位 +extern uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length); +extern uint32 seekfree_assistant_receive (uint8 *buff, uint32 length); + +#if (1 == SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE) +#include "zf_common_fifo.h" +static uint8 seekfree_assistant_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE]; // FIFO缓冲区 +static fifo_struct seekfree_assistant_fifo = // FIFO结构体 +{ + .buffer = seekfree_assistant_buffer, + .execution = FIFO_IDLE, + .type = FIFO_DATA_8BIT, + .head = 0, + .end = 0, + .size = SEEKFREE_ASSISTANT_BUFFER_SIZE, + .max = SEEKFREE_ASSISTANT_BUFFER_SIZE, +}; +#endif + +static seekfree_assistant_camera_struct seekfree_assistant_camera_data; // 图像上位机协议数据 +static seekfree_assistant_camera_dot_struct seekfree_assistant_camera_dot_data; // 图像上位机打点协议数据 +static seekfree_assistant_camera_buffer_struct seekfree_assistant_camera_buffer; // 图像以及边界缓冲区信息 + +seekfree_assistant_transfer_callback_function seekfree_assistant_transfer_callback = seekfree_assistant_transfer; // 数据发送函数指针 +seekfree_assistant_receive_callback_function seekfree_assistant_receive_callback = seekfree_assistant_receive; // 数据接收函数指针 + +seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 +float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 保存接收到的参数 +vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 参数更新标志位 //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手求和函数 @@ -87,7 +109,7 @@ void seekfree_assistant_camera_data_send (seekfree_assistant_image_type_enum cam seekfree_assistant_camera_data.image_height = height; // 首先发送帧头、功能、摄像头类型、以及宽度高度等信息 - seekfree_assistant_transfer((const uint8 *)&seekfree_assistant_camera_data, sizeof(seekfree_assistant_camera_struct)); + seekfree_assistant_transfer_callback((const uint8 *)&seekfree_assistant_camera_data, sizeof(seekfree_assistant_camera_struct)); // 根据摄像头类型计算图像大小 switch(camera_type) @@ -111,9 +133,8 @@ void seekfree_assistant_camera_data_send (seekfree_assistant_image_type_enum cam // 发送图像数据 if(NULL != image_addr) { - seekfree_assistant_transfer(image_addr, image_size); + seekfree_assistant_transfer_callback(image_addr, image_size); } - } //------------------------------------------------------------------------------------------------------------------- @@ -139,16 +160,15 @@ void seekfree_assistant_camera_dot_send (seekfree_assistant_camera_buffer_struct dot_bytes *= 2; } - // 首先发送帧头、功能、边界编号、坐标长度、点个数 - seekfree_assistant_transfer((const uint8 *)&seekfree_assistant_camera_dot_data, sizeof(seekfree_assistant_camera_dot_struct)); + seekfree_assistant_transfer_callback((const uint8 *)&seekfree_assistant_camera_dot_data, sizeof(seekfree_assistant_camera_dot_struct)); for(i=0; i < SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY; i++) { // 判断是否发送横坐标数据 if(NULL != buffer->boundary_x[i]) { - seekfree_assistant_transfer((const uint8 *)buffer->boundary_x[i], dot_bytes); + seekfree_assistant_transfer_callback((const uint8 *)buffer->boundary_x[i], dot_bytes); } // 判断是否发送纵坐标数据 @@ -156,10 +176,9 @@ void seekfree_assistant_camera_dot_send (seekfree_assistant_camera_buffer_struct { // 如果没有纵坐标数据,则表示每一行只有一个边界 // 指定了横纵坐标数据,这种方式可以实现同一行多个边界的情况,例如搜线算法能够搜索出回弯。 - seekfree_assistant_transfer((const uint8 *)buffer->boundary_y[i], dot_bytes); + seekfree_assistant_transfer_callback((const uint8 *)buffer->boundary_y[i], dot_bytes); } } - } //------------------------------------------------------------------------------------------------------------------- @@ -193,7 +212,7 @@ void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struc // 数据在调用本函数之前,由用户将需要发送的数据写入seekfree_assistant_oscilloscope_data.data[] - seekfree_assistant_transfer((const uint8 *)seekfree_assistant_oscilloscope, packet_size); + seekfree_assistant_transfer_callback((const uint8 *)seekfree_assistant_oscilloscope, packet_size); } //------------------------------------------------------------------------------------------------------------------- @@ -364,12 +383,14 @@ void seekfree_assistant_camera_send (void) } } + //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手解析接收到的数据 // 参数说明 void // 返回参数 void // 使用示例 函数只需要放到周期运行的PIT中断或者主循环即可 //------------------------------------------------------------------------------------------------------------------- +#if (1 == SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE) void seekfree_assistant_data_analysis (void) { uint8 temp_sum; @@ -380,14 +401,13 @@ void seekfree_assistant_data_analysis (void) uint32 temp_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE / 4]; // 尝试读取数据, 如果不是自定义的传输方式则从接收回调中读取数据 - read_length = seekfree_assistant_receive((uint8 *)temp_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); + read_length = seekfree_assistant_receive_callback((uint8 *)temp_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); if(read_length) { // 将读取到的数据写入FIFO fifo_write_buffer(&seekfree_assistant_fifo, (uint8 *)temp_buffer, read_length); } - while(sizeof(seekfree_assistant_parameter_struct) <= fifo_used(&seekfree_assistant_fifo)) { read_length = sizeof(seekfree_assistant_parameter_struct); @@ -416,21 +436,11 @@ void seekfree_assistant_data_analysis (void) } } - // 丢弃无需使用的数据 fifo_read_buffer(&seekfree_assistant_fifo, (uint8 *)temp_buffer, &read_length, FIFO_READ_AND_CLEAN); } } - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 逐飞助手 初始化 -// 参数说明 -// 返回参数 void -// 使用示例 -//------------------------------------------------------------------------------------------------------------------- -ZF_WEAK void seekfree_assistant_init () -{ - fifo_init(&seekfree_assistant_fifo, FIFO_DATA_8BIT, seekfree_assistant_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); -} +#endif + diff --git a/Example/E13_dual_core_demo/libraries/zf_components/seekfree_assistant.h b/Example/E13_dual_core_demo/libraries/zf_components/seekfree_assistant.h index d02abb1..ae0f67c 100644 --- a/Example/E13_dual_core_demo/libraries/zf_components/seekfree_assistant.h +++ b/Example/E13_dual_core_demo/libraries/zf_components/seekfree_assistant.h @@ -1,69 +1,75 @@ -/*/********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +/********************************************************************************************************************* +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ #ifndef _seekfree_assistant_h_ #define _seekfree_assistant_h_ #include "zf_common_typedef.h" -#include "zf_common_debug.h" + + +// 1:使能参数调节的功能 0:关闭参数调节的功能 +#define SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE ( 1 ) + + // 定义接收FIFO大小 -#define SEEKFREE_ASSISTANT_BUFFER_SIZE ( 0x80 ) +#define SEEKFREE_ASSISTANT_BUFFER_SIZE ( 0x80 ) + +// 定义示波器的最大通道数量 +#define SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT ( 0x08 ) + +// 定义参数调试的最大通道数量 +#define SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT ( 0x08 ) + +// 定义图像边线最大数量 +#define SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY ( 0x08 ) + +// 单片机往上位机发送的帧头 +#define SEEKFREE_ASSISTANT_SEND_HEAD ( 0xAA ) + +// 摄像头类 +#define SEEKFREE_ASSISTANT_CAMERA_FUNCTION ( 0x02 ) +#define SEEKFREE_ASSISTANT_CAMERA_DOT_FUNCTION ( 0x03 ) +#define SEEKFREE_ASSISTANT_CAMERA_OSCILLOSCOPE ( 0x10 ) + +// 上位机往单片机发送的帧头 +#define SEEKFREE_ASSISTANT_RECEIVE_HEAD ( 0x55 ) + +// 参数设置类 +#define SEEKFREE_ASSISTANT_RECEIVE_SET_PARAMETER ( 0x20 ) -// 定义示波器的最大通道数量 -#define SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT ( 0x08 ) - -// 定义参数调试的最大通道数量 -#define SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT ( 0x08 ) - -// 定义图像边线最大数量 -#define SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY ( 0x08 ) - -// 单片机往上位机发送的帧头 -#define SEEKFREE_ASSISTANT_SEND_HEAD ( 0xAA ) - -// 摄像头类 -#define SEEKFREE_ASSISTANT_CAMERA_FUNCTION ( 0x02 ) -#define SEEKFREE_ASSISTANT_CAMERA_DOT_FUNCTION ( 0x03 ) -#define SEEKFREE_ASSISTANT_CAMERA_OSCILLOSCOPE ( 0x10 ) - -// 上位机往单片机发送的帧头 -#define SEEKFREE_ASSISTANT_RECEIVE_HEAD ( 0x55 ) - -// 参数设置类 -#define SEEKFREE_ASSISTANT_RECEIVE_SET_PARAMETER ( 0x20 ) // 摄像头类型枚举 typedef enum @@ -91,71 +97,69 @@ typedef enum typedef struct { - uint8 head; // 帧头 - uint8 channel_num; // 高四位为功能字 低四位为通道数量 - uint8 check_sum; // 和校验 - uint8 length; // 包长度 - float data[SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT]; // 通道数据 + uint8 head; // 帧头 + uint8 channel_num; // 高四位为功能字 低四位为通道数量 + uint8 check_sum; // 和校验 + uint8 length; // 包长度 + float data[SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT]; // 通道数据 }seekfree_assistant_oscilloscope_struct; typedef struct { - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 camera_type; // 低四位表示边界数量 第四位表示是否有图像数据 例如0x13:其中3表示一副图像有三条边界(通常是左边界、中线、右边界)、1表示没有图像数据 - uint8 length; // 包长度(仅包含协议部分) - uint16 image_width; // 图像宽度 - uint16 image_height; // 图像高度 -}seekfree_assistant_camera_struct; - - -typedef struct -{ - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 dot_type; // 点类型 BIT5:1:坐标是16位的 0:坐标是8位的 BIT7-BIT6:0:只有X坐标 1:只有Y坐标 2:X和Y坐标都有 BIT3-BIT0:边界数量 - uint8 length; // 包长度(仅包含协议部分) - uint16 dot_num; // 画点数量 - uint8 valid_flag; // 通道标识 - uint8 reserve; // 保留 -}seekfree_assistant_camera_dot_struct; - -typedef struct -{ - void *image_addr; // 摄像头地址 - uint16 width; // 图像宽度 - uint16 height; // 图像高度 - seekfree_assistant_image_type_enum camera_type; // 摄像头类型 - void *boundary_x[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界横坐标数组地址 - void *boundary_y[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界纵坐标数组地址 + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 camera_type; // 低四位表示边界数量 第四位表示是否有图像数据 例如0x13:其中3表示一副图像有三条边界(通常是左边界、中线、右边界)、1表示没有图像数据 + uint8 length; // 包长度(仅包含协议部分) + uint16 image_width; // 图像宽度 + uint16 image_height; // 图像高度 +}seekfree_assistant_camera_struct; + + +typedef struct +{ + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 dot_type; // 点类型 BIT5:1:坐标是16位的 0:坐标是8位的 BIT7-BIT6:0:只有X坐标 1:只有Y坐标 2:X和Y坐标都有 BIT3-BIT0:边界数量 + uint8 length; // 包长度(仅包含协议部分) + uint16 dot_num; // 画点数量 + uint8 valid_flag; // 通道标识 + uint8 reserve; // 保留 +}seekfree_assistant_camera_dot_struct; + +typedef struct +{ + void *image_addr; // 摄像头地址 + uint16 width; // 图像宽度 + uint16 height; // 图像高度 + seekfree_assistant_image_type_enum camera_type; // 摄像头类型 + void *boundary_x[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界横坐标数组地址 + void *boundary_y[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界纵坐标数组地址 }seekfree_assistant_camera_buffer_struct; typedef struct { - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 channel; // 通道 - uint8 check_sum; // 和校验 - float data; // 数据 + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 channel; // 通道 + uint8 check_sum; // 和校验 + float data; // 数据 }seekfree_assistant_parameter_struct; +typedef uint32 (*seekfree_assistant_transfer_callback_function) (const uint8 *buff, uint32 length); +typedef uint32 (*seekfree_assistant_receive_callback_function) (uint8 *buff, uint32 length); -extern seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 -extern float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 保存接收到的参数 -extern vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 参数更新标志位 +extern seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 +extern float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 保存接收到的参数 +extern vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 参数更新标志位 + + +void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struct *seekfree_assistant_oscilloscope); +void seekfree_assistant_camera_information_config (seekfree_assistant_image_type_enum camera_type, void *image_addr, uint16 width, uint16 height); +void seekfree_assistant_camera_boundary_config (seekfree_assistant_boundary_type_enum boundary_type, uint16 dot_num, void *dot_x1, void *dot_x2, void *dot_x3, void *dot_y1, void *dot_y2, void *dot_y3); +void seekfree_assistant_camera_send (void); +void seekfree_assistant_data_analysis (void); -uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length); -uint32 seekfree_assistant_receive (uint8 *buff, uint32 length); - -void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struct *seekfree_assistant_oscilloscope); - -void seekfree_assistant_camera_information_config (seekfree_assistant_image_type_enum camera_type, void *image_addr, uint16 width, uint16 height); -void seekfree_assistant_camera_boundary_config (seekfree_assistant_boundary_type_enum boundary_type, uint16 dot_num, void *dot_x1, void *dot_x2, void *dot_x3, void *dot_y1, void *dot_y2, void *dot_y3); -void seekfree_assistant_camera_send (void); - -void seekfree_assistant_data_analysis (void); -void seekfree_assistant_init (void); #endif diff --git a/Example/E13_dual_core_demo/libraries/zf_components/seekfree_assistant_interface.c b/Example/E13_dual_core_demo/libraries/zf_components/seekfree_assistant_interface.c index 99dbeef..fdade63 100644 --- a/Example/E13_dual_core_demo/libraries/zf_components/seekfree_assistant_interface.c +++ b/Example/E13_dual_core_demo/libraries/zf_components/seekfree_assistant_interface.c @@ -1,42 +1,55 @@ /********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant_interface * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ #include "zf_common_typedef.h" +#include "zf_common_fifo.h" #include "zf_common_debug.h" +#include "zf_driver_uart.h" +#include "zf_device_wireless_uart.h" +#include "zf_device_bluetooth_ch9141.h" +#include "zf_device_wifi_uart.h" +#include "zf_device_wifi_spi.h" #include "seekfree_assistant.h" +#include "seekfree_assistant_interface.h" + + +extern seekfree_assistant_transfer_callback_function seekfree_assistant_transfer_callback; // 数据发送函数指针 +extern seekfree_assistant_receive_callback_function seekfree_assistant_receive_callback; // 数据接收函数指针 + + //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手发送函数 // 参数说明 *buff 需要发送的数据地址 @@ -46,11 +59,9 @@ //------------------------------------------------------------------------------------------------------------------- ZF_WEAK uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length) { - uint32 len = 0; - - len = debug_send_buffer(buff, length); - - return len; + + // 当选择自定义通讯方式时 需要自行完成数据发送功能 + return length; } //------------------------------------------------------------------------------------------------------------------- @@ -62,11 +73,57 @@ ZF_WEAK uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length) //------------------------------------------------------------------------------------------------------------------- ZF_WEAK uint32 seekfree_assistant_receive (uint8 *buff, uint32 length) { - uint32 len = 0; + // 当选择自定义通讯方式时 需要自行完成数据接收功能 + return 0; +} - len = debug_read_ring_buffer(buff, length); - - return len; +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 逐飞助手接口 初始化 +// 参数说明 +// 返回参数 void +// 使用示例 seekfree_assistant_interface_init(SEEKFREE_ASSISTANT_WIFI_SPI); 使用高速WIFI SPI模块进行数据收发 +// 备注 需要自行调用设备的初始化,例如使用无线转串口进行数据的收发,则需要自行调用无线转串口的初始化,然后再调用seekfree_assistant_interface_init完成逐飞助手的接口初始化 +//------------------------------------------------------------------------------------------------------------------- +ZF_WEAK void seekfree_assistant_interface_init (seekfree_assistant_transfer_device_enum transfer_device) +{ + switch(transfer_device) + { + case SEEKFREE_ASSISTANT_DEBUG_UART: + { + seekfree_assistant_transfer_callback = debug_send_buffer; + seekfree_assistant_receive_callback = debug_read_ring_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIRELESS_UART: + { + seekfree_assistant_transfer_callback = wireless_uart_send_buffer; + seekfree_assistant_receive_callback = wireless_uart_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_CH9141: + { + seekfree_assistant_transfer_callback = bluetooth_ch9141_send_buffer; + seekfree_assistant_receive_callback = bluetooth_ch9141_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIFI_UART: + { + seekfree_assistant_transfer_callback = wifi_uart_send_buffer; + seekfree_assistant_receive_callback = wifi_uart_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIFI_SPI: + { + seekfree_assistant_transfer_callback = wifi_spi_send_buffer; + seekfree_assistant_receive_callback = wifi_spi_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_CUSTOM: + { + // 根据自己的需求 自行实现seekfree_assistant_transfer与seekfree_assistant_receive函数,完成数据的收发 + + }break; + } } diff --git a/Example/E13_dual_core_demo/libraries/zf_components/seekfree_assistant_interface.h b/Example/E13_dual_core_demo/libraries/zf_components/seekfree_assistant_interface.h new file mode 100644 index 0000000..940b5f7 --- /dev/null +++ b/Example/E13_dual_core_demo/libraries/zf_components/seekfree_assistant_interface.h @@ -0,0 +1,57 @@ +/********************************************************************************************************************* +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 +* Copyright (c) 2022 SEEKFREE 逐飞科技 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 +* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 +* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 +* +* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 +* 甚至没有隐含的适销性或适合特定用途的保证 +* 更多细节请参见 GPL +* +* 您应该在收到本开源库的同时收到一份 GPL 的副本 +* 如果没有,请参阅 +* +* 额外注明: +* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 +* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 +* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 +* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) +* +* 文件名称 seekfree_assistant_interface +* 公司名称 成都逐飞科技有限公司 +* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A +* 店铺链接 https://seekfree.taobao.com/ +* +* 修改记录 +* 日期 作者 备注 +* 2024-1-11 SeekFree first version +********************************************************************************************************************/ + +#ifndef _seekfree_assistant_interface_h_ +#define _seekfree_assistant_interface_h_ + + + +// 数据发送设备枚举 +typedef enum +{ + SEEKFREE_ASSISTANT_DEBUG_UART, // 调试串口 使用的串口由DEBUG_UART_INDEX宏定义指定 + SEEKFREE_ASSISTANT_WIRELESS_UART, // 无线转串口 + SEEKFREE_ASSISTANT_CH9141, // CH9141蓝牙 + SEEKFREE_ASSISTANT_WIFI_UART, // WIFI转串口 + SEEKFREE_ASSISTANT_WIFI_SPI, // 高速WIFI SPI + SEEKFREE_ASSISTANT_CUSTOM, // 自定义通讯方式 需要自行seekfree_assistant_transfer与seekfree_assistant_receive函数 +}seekfree_assistant_transfer_device_enum; + + +void seekfree_assistant_interface_init (seekfree_assistant_transfer_device_enum transfer_device); + + + +#endif diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_absolute_encoder.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_absolute_encoder.c index 7c80a3b..f9bc809 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_absolute_encoder.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_absolute_encoder.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_absolute_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_absolute_encoder.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_absolute_encoder.h index e6cc057..ed92906 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_absolute_encoder.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_absolute_encoder.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_absolute_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c index 500bccb..b0a06df 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_bluetooth_ch9141 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -54,7 +54,7 @@ #include "zf_device_camera.h" #include "zf_device_bluetooth_ch9141.h" -static fifo_obj_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 +static fifo_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 static uint8 bluetooth_ch9141_buffer[BLUETOOTH_CH9141_BUFFER_SIZE]; // 数据存放数组 static uint8 bluetooth_ch9141_data = 0; // 数据临时存放变量 diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h index 800be6c..ffb30b5 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h @@ -24,7 +24,7 @@ * 文件名称 main * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_camera.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_camera.c index 84c7aa0..68668c4 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_camera.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_camera.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_camera * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -45,7 +45,7 @@ #include "zf_device_camera.h" -fifo_obj_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 +fifo_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; // 定义摄像头接收数据缓冲区 uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // 定义摄像头数据发送到上位机的帧头 diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_camera.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_camera.h index 58efb06..2cd7d2d 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_camera.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_camera.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_camera * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -44,7 +44,7 @@ //=================================================摄像头公共库 基本配置================================================ #define CAMERA_RECEIVER_BUFFER_SIZE (8) // 定义摄像头接收数据缓冲区大小 -extern fifo_obj_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 +extern fifo_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 extern uint8 camera_send_image_frame_header[4]; // 声明摄像头数据发送到上位机的帧头 //=================================================摄像头公共库 基本配置================================================ diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_config.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_config.h index af6a3d8..6c8147d 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_config.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_config.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_config * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_dl1a.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_dl1a.c index 3e7410c..27be3a7 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_dl1a.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_dl1a.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1a * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_dl1a.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_dl1a.h index 89145d3..3176dd3 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_dl1a.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_dl1a.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1a * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_dl1b.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_dl1b.c index 90e64b3..96e472e 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_dl1b.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_dl1b.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1b * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_dl1b.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_dl1b.h index b144739..922b3ce 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_dl1b.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_dl1b.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1b * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_gnss.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_gnss.c new file mode 100644 index 0000000..caf7cd0 --- /dev/null +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_gnss.c @@ -0,0 +1,620 @@ +/********************************************************************************************************************* +* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* Copyright (c) 2022 SEEKFREE 逐飞科技 +* +* 本文件是 TC264 开源库的一部分 +* +* TC264 开源库 是免费软件 +* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 +* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 +* +* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 +* 甚至没有隐含的适销性或适合特定用途的保证 +* 更多细节请参见 GPL +* +* 您应该在收到本开源库的同时收到一份 GPL 的副本 +* 如果没有,请参阅 +* +* 额外注明: +* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 +* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 +* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 +* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) +* +* 文件名称 zf_device_gnss +* 公司名称 成都逐飞科技有限公司 +* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 +* 开发环境 ADS v1.9.20 +* 适用平台 TC264D +* 店铺链接 https://seekfree.taobao.com/ +* +* 修改记录 +* 日期 作者 备注 +* 2023-12-28 pudding first version +********************************************************************************************************************/ +/********************************************************************************************************************* +* 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* RX 查看 zf_device_gnss.h 中 GNSS_RX 宏定义 +* TX 查看 zf_device_gnss.h 中 GNSS_TX 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* ------------------------------------ +********************************************************************************************************************/ + +#include "math.h" +#include "zf_common_function.h" +#include "zf_common_fifo.h" +#include "zf_driver_delay.h" +#include "zf_driver_uart.h" + +#include "zf_device_gnss.h" + +#define GNSS_BUFFER_SIZE ( 128 ) + +uint8 gnss_flag = 0; // 1:采集完成等待处理数据 0:没有采集完成 +gnss_info_struct gnss; // GPS解析之后的数据 + +static uint8 gnss_state = 0; // 1:GPS初始化完成 +static fifo_struct gnss_receiver_fifo; // +static uint8 gnss_receiver_buffer[GNSS_BUFFER_SIZE]; // 数据存放数组 + +static gps_state_enum gnss_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 +static gps_state_enum gnss_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 +static gps_state_enum gnss_ths_state = GPS_STATE_RECEIVING; // rmc 语句状态 + +static uint8 gps_gga_buffer[GNSS_BUFFER_SIZE]; +static uint8 gps_rmc_buffer[GNSS_BUFFER_SIZE]; +static uint8 gps_ths_buffer[GNSS_BUFFER_SIZE]; + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 获取指定 ',' 后面的索引 +// 参数说明 num 第几个逗号 +// 参数说明 *str 字符串 +// 返回参数 uint8 返回索引 +// 使用示例 get_parameter_index(1, s); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 get_parameter_index (uint8 num, char *str) +{ + uint8 i = 0, j = 0; + char *temp = strchr(str, '\n'); + uint8 len = 0, len1 = 0; + + 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; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 给定字符串第一个 ',' 之前的数据转换为int +// 参数说明 *s 字符串 +// 返回参数 float 返回数值 +// 使用示例 get_int_number(&buf[get_parameter_index(7, buf)]); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static int get_int_number (char *s) +{ + char buf[10]; + uint8 i = 0; + int return_value = 0; + i = get_parameter_index(1, s); + i = i - 1; + strncpy(buf, s, i); + buf[i] = 0; + return_value = func_str_to_int(buf); + return return_value; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 给定字符串第一个 ',' 之前的数据转换为float +// 参数说明 *s 字符串 +// 返回参数 float 返回数值 +// 使用示例 get_float_number(&buf[get_parameter_index(8, buf)]); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static float get_float_number (char *s) +{ + uint8 i = 0; + char buf[15]; + float return_value = 0; + + i = get_parameter_index(1, s); + i = i - 1; + strncpy(buf, s, i); + buf[i] = 0; + return_value = (float)func_str_to_double(buf); + return return_value; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 给定字符串第一个 ',' 之前的数据转换为double +// 参数说明 *s 字符串 +// 返回参数 double 返回数值 +// 使用示例 get_double_number(&buf[get_parameter_index(3, buf)]); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static double get_double_number (char *s) +{ + uint8 i = 0; + char buf[15]; + double return_value = 0; + + i = get_parameter_index(1, s); + i = i - 1; + strncpy(buf, s, i); + buf[i] = 0; + return_value = func_str_to_double(buf); + return return_value; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 世界时间转换为北京时间 +// 参数说明 *time 保存的时间 +// 返回参数 void +// 使用示例 utc_to_btc(&gnss->time); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static void utc_to_btc (gps_time_struct *time) +{ + uint8 day_num = 0; + + time->hour = time->hour + 8; + if(23 < time->hour) + { + time->hour -= 24; + time->day += 1; + + if(2 == time->month) + { + day_num = 28; + if((0 == time->year % 4 && 0 != time->year % 100) || 0 == time->year % 400) // 判断是否为闰年 + { + day_num ++; // 闰月 2月为29天 + } + } + else + { + day_num = 31; // 1 3 5 7 8 10 12这些月份为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(12 < time->month) + { + time->month -= 12; + time->year ++; + } + } + } +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 RMC语句解析 +// 参数说明 *line 接收到的语句信息 +// 参数说明 *gnss 保存解析后的数据 +// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 +// 使用示例 gps_gnrmc_parse((char *)data_buffer, &gnss); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 gps_gnrmc_parse (char *line, gnss_info_struct *gnss) +{ + uint8 state = 0, temp = 0; + + double latitude = 0; // 纬度 + double longitude = 0; // 经度 + + double lati_cent_tmp = 0, lati_second_tmp = 0; + double long_cent_tmp = 0, long_second_tmp = 0; + float speed_tmp = 0; + char *buf = line; + uint8 return_state = 0; + + state = buf[get_parameter_index(2, buf)]; + + if('A' == state) // 如果数据有效 则解析数据 + { + return_state = 1; + gnss->state = 1; + gnss -> ns = buf[get_parameter_index(4, buf)]; + gnss -> 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)]); + + gnss->latitude_degree = (int)latitude / 100; // 纬度转换为度分秒 + lati_cent_tmp = (latitude - gnss->latitude_degree * 100); + gnss->latitude_cent = (int)lati_cent_tmp; + lati_second_tmp = (lati_cent_tmp - gnss->latitude_cent) * 6000; + gnss->latitude_second = (int)lati_second_tmp; + + gnss->longitude_degree = (int)longitude / 100; // 经度转换为度分秒 + long_cent_tmp = (longitude - gnss->longitude_degree * 100); + gnss->longitude_cent = (int)long_cent_tmp; + long_second_tmp = (long_cent_tmp - gnss->longitude_cent) * 6000; + gnss->longitude_second = (int)long_second_tmp; + + gnss->latitude = gnss->latitude_degree + lati_cent_tmp / 60; + gnss->longitude = gnss->longitude_degree + long_cent_tmp / 60; + + speed_tmp = get_float_number(&buf[get_parameter_index(7, buf)]); // 速度(海里/小时) + gnss->speed = speed_tmp * 1.85f; // 转换为公里/小时 + gnss->direction = get_float_number(&buf[get_parameter_index(8, buf)]); // 角度 + } + else + { + gnss->state = 0; + } + + // 在定位没有生效前也是有时间数据的,可以直接解析 + gnss->time.hour = (buf[7] - '0') * 10 + (buf[8] - '0'); // 时间 + gnss->time.minute = (buf[9] - '0') * 10 + (buf[10] - '0'); + gnss->time.second = (buf[11] - '0') * 10 + (buf[12] - '0'); + temp = get_parameter_index(9, buf); + gnss->time.day = (buf[temp + 0] - '0') * 10 + (buf[temp + 1] - '0'); // 日期 + gnss->time.month = (buf[temp + 2] - '0') * 10 + (buf[temp + 3] - '0'); + gnss->time.year = (buf[temp + 4] - '0') * 10 + (buf[temp + 5] - '0') + 2000; + + utc_to_btc(&gnss->time); + + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 GGA语句解析 +// 参数说明 *line 接收到的语句信息 +// 参数说明 *gnss 保存解析后的数据 +// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 +// 使用示例 gps_gngga_parse((char *)data_buffer, &gnss); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 gps_gngga_parse (char *line, gnss_info_struct *gnss) +{ + uint8 state = 0; + char *buf = line; + uint8 return_state = 0; + + state = buf[get_parameter_index(2, buf)]; + + if(',' != state) + { + gnss->satellite_used = (uint8)get_int_number(&buf[get_parameter_index(7, buf)]); + gnss->height = get_float_number(&buf[get_parameter_index(9, buf)]) + get_float_number(&buf[get_parameter_index(11, buf)]); // 高度 = 海拔高度 + 地球椭球面相对大地水准面的高度 + return_state = 1; + } + + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 THS语句解析 +// 参数说明 *line 接收到的语句信息 +// 参数说明 *gnss 保存解析后的数据 +// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 +// 使用示例 gps_gnths_parse((char *)data_buffer, &gnss); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 gps_gnths_parse (char *line, gnss_info_struct *gnss) +{ + uint8 state = 0; + char *buf = line; + uint8 return_state = 0; + + state = buf[get_parameter_index(2, buf)]; + + if('A' == state) + { + gnss->antenna_direction_state = 1; + gnss->antenna_direction = get_float_number(&buf[get_parameter_index(1, buf)]); + return_state = 1; + } + else + { + gnss->antenna_direction_state = 0; + } + + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 计算从第一个点到第二个点的距离 +// 参数说明 latitude1 第一个点的纬度 +// 参数说明 longitude1 第一个点的经度 +// 参数说明 latitude2 第二个点的纬度 +// 参数说明 longitude2 第二个点的经度 +// 返回参数 double 返回两点距离 +// 使用示例 get_two_points_distance(latitude1_1, longitude1, latitude2, longitude2); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +double get_two_points_distance (double latitude1, double longitude1, double latitude2, double longitude2) +{ + const double EARTH_RADIUS = 6378137; // 地球半径(单位:m) + double rad_latitude1 = 0; + double rad_latitude2 = 0; + double rad_longitude1 = 0; + double rad_longitude2 = 0; + double distance = 0; + double a = 0; + double b = 0; + + rad_latitude1 = ANGLE_TO_RAD(latitude1); // 根据角度计算弧度 + 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 里面实现的算法 + distance = distance * EARTH_RADIUS; + + return distance; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 计算从第一个点到第二个点的方位角 +// 参数说明 latitude1 第一个点的纬度 +// 参数说明 longitude1 第一个点的经度 +// 参数说明 latitude2 第二个点的纬度 +// 参数说明 longitude2 第二个点的经度 +// 返回参数 double 返回方位角(0至360) +// 使用示例 get_two_points_azimuth(latitude1_1, longitude1, latitude2, longitude2); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +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 ((0 < angle) ? angle : (angle + 360)); +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 解析GPS数据 +// 参数说明 void +// 返回参数 uint8 0-解析成功 1-解析失败 可能数据包错误 +// 使用示例 gps_data_parse(); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +uint8 gnss_data_parse (void) +{ + uint8 return_state = 0; + uint8 check_buffer[5] = {'0', 'x', 0x00, 0x00, 0x00}; + uint8 bbc_xor_origin = 0; + uint8 bbc_xor_calculation = 0; + uint32 data_len = 0; + + do + { + if(GPS_STATE_RECEIVED == gnss_rmc_state) + { + gnss_rmc_state = GPS_STATE_PARSING; + strncpy((char *)&check_buffer[2], strchr((const char *)gps_rmc_buffer, '*') + 1, 2); + bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); + for(bbc_xor_calculation = gps_rmc_buffer[1], data_len = 2; '*' != gps_rmc_buffer[data_len]; data_len ++) + { + bbc_xor_calculation ^= gps_rmc_buffer[data_len]; + } + if(bbc_xor_calculation != bbc_xor_origin) + { + // 数据校验失败 + return_state = 1; + break; + } + + gps_gnrmc_parse((char *)gps_rmc_buffer, &gnss); + } + gnss_rmc_state = GPS_STATE_RECEIVING; + + if(GPS_STATE_RECEIVED == gnss_gga_state) + { + gnss_gga_state = GPS_STATE_PARSING; + strncpy((char *)&check_buffer[2], strchr((const char *)gps_gga_buffer, '*') + 1, 2); + bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); + + for(bbc_xor_calculation = gps_gga_buffer[1], data_len = 2; '*' != gps_gga_buffer[data_len]; data_len ++) + { + bbc_xor_calculation ^= gps_gga_buffer[data_len]; + } + if(bbc_xor_calculation != bbc_xor_origin) + { + // 数据校验失败 + return_state = 1; + break; + } + + gps_gngga_parse((char *)gps_gga_buffer, &gnss); + } + gnss_gga_state = GPS_STATE_RECEIVING; + + if(GPS_STATE_RECEIVED == gnss_ths_state) + { + gnss_ths_state = GPS_STATE_PARSING; + strncpy((char *)&check_buffer[2], strchr((const char *)gps_ths_buffer, '*') + 1, 2); + bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); + + for(bbc_xor_calculation = gps_ths_buffer[1], data_len = 2; '*' != gps_ths_buffer[data_len]; data_len ++) + { + bbc_xor_calculation ^= gps_ths_buffer[data_len]; + } + if(bbc_xor_calculation != bbc_xor_origin) + { + // 数据校验失败 + return_state = 1; + break; + } + + gps_gnths_parse((char *)gps_ths_buffer, &gnss); + } + gnss_ths_state = GPS_STATE_RECEIVING; + + }while(0); + return return_state; +} + + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 GPS串口回调函数 +// 参数说明 void +// 返回参数 void +// 使用示例 gps_uart_callback(); +// 备注信息 此函数需要在串口接收中断内进行调用 +//------------------------------------------------------------------------------------------------------------------- +void gnss_uart_callback (void) +{ + uint8 temp_gps[6]; + uint32 temp_length = 0; + + + + + if(gnss_state) + { + uint8 dat; + while(uart_query_byte(GNSS_UART, &dat)) + { + fifo_write_buffer(&gnss_receiver_fifo, &dat, 1); + } + + if('\n' == dat) + { + // 读取前6个数据 用于判断语句类型 + temp_length = 6; + fifo_read_buffer(&gnss_receiver_fifo, temp_gps, &temp_length, FIFO_READ_ONLY); + + // 根据不同类型将数据拷贝到不同的缓冲区 + if(0 == strncmp((char *)&temp_gps[3], "RMC", 3)) + { + // 如果没有在解析数据则更新缓冲区的数据 + if(GPS_STATE_PARSING != gnss_rmc_state) + { + gnss_rmc_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_rmc_buffer, &temp_length, FIFO_READ_AND_CLEAN); + } + } + else if(0 == strncmp((char *)&temp_gps[3], "GGA", 3)) + { + // 如果没有在解析数据则更新缓冲区的数据 + if(GPS_STATE_PARSING != gnss_gga_state) + { + gnss_gga_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_gga_buffer, &temp_length, FIFO_READ_AND_CLEAN); + } + } + else if(0 == strncmp((char *)&temp_gps[3], "THS", 3)) + { + // 如果没有在解析数据则更新缓冲区的数据 + if(GPS_STATE_PARSING != gnss_ths_state) + { + gnss_ths_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_ths_buffer, &temp_length, FIFO_READ_AND_CLEAN); + } + } + + // 统一将FIFO清空 + fifo_clear(&gnss_receiver_fifo); + + gnss_flag = 1; + } + } +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 GPS初始化 +// 参数说明 void +// 返回参数 void +// 使用示例 gps_init(); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +void gnss_init (gps_device_enum gps_device) +{ + 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}; + + if((TAU1201 == gps_device) || (GN42A == gps_device)) + { + fifo_init(&gnss_receiver_fifo, FIFO_DATA_8BIT, gnss_receiver_buffer, GNSS_BUFFER_SIZE); + system_delay_ms(500); // 等待GPS启动后开始初始化 + uart_init(GNSS_UART, 115200, GNSS_RX, GNSS_TX); + + uart_write_buffer(GNSS_UART, (uint8 *)set_rate, sizeof(set_rate)); // 设置GPS更新速率为10hz 如果不调用此语句则默认为1hz + system_delay_ms(200); + + uart_write_buffer(GNSS_UART, (uint8 *)open_rmc, sizeof(open_rmc)); // 开启rmc语句 + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)open_gga, sizeof(open_gga)); // 开启gga语句 + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gll, sizeof(close_gll)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gsa, sizeof(close_gsa)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_grs, sizeof(close_grs)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gsv, sizeof(close_gsv)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_vtg, sizeof(close_vtg)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_zda, sizeof(close_zda)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gst, sizeof(close_gst)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_txt, sizeof(close_txt)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_txt_ant, sizeof(close_txt_ant)); + system_delay_ms(50); + + gnss_state = 1; + uart_rx_interrupt(GNSS_UART, 1); + } + else if(GN43RFA == gps_device) + { + // GN43RFA RTK模块不需要进行参数设置,如果需要修改参数应该使用专用的上位机修改参数 + fifo_init(&gnss_receiver_fifo, FIFO_DATA_8BIT, gnss_receiver_buffer, GNSS_BUFFER_SIZE); + uart_init(GNSS_UART, 115200, GNSS_RX, GNSS_TX); + gnss_state = 1; + uart_rx_interrupt(GNSS_UART, 1); + } + +} diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_gnss.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_gnss.h new file mode 100644 index 0000000..5d58976 --- /dev/null +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_gnss.h @@ -0,0 +1,125 @@ +/********************************************************************************************************************* +* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* Copyright (c) 2022 SEEKFREE 逐飞科技 +* +* 本文件是 TC264 开源库的一部分 +* +* TC264 开源库 是免费软件 +* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 +* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 +* +* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 +* 甚至没有隐含的适销性或适合特定用途的保证 +* 更多细节请参见 GPL +* +* 您应该在收到本开源库的同时收到一份 GPL 的副本 +* 如果没有,请参阅 +* +* 额外注明: +* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 +* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 +* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 +* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) +* +* 文件名称 zf_device_gnss +* 公司名称 成都逐飞科技有限公司 +* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 +* 开发环境 ADS v1.9.20 +* 适用平台 TC264D +* 店铺链接 https://seekfree.taobao.com/ +* +* 修改记录 +* 日期 作者 备注 +* 2023-12-28 pudding first version +********************************************************************************************************************/ +/********************************************************************************************************************* +* 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* RX 查看 zf_device_gnss.h 中 GNSS_RX 宏定义 +* TX 查看 zf_device_gnss.h 中 GNSS_TX 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* ------------------------------------ +********************************************************************************************************************/ + +#ifndef _zf_device_gnss_h_ +#define _zf_device_gnss_h_ + +#include "zf_common_typedef.h" + +//-------------------------------------------------------------------------------------------------- +//引脚配置 +//-------------------------------------------------------------------------------------------------- +#define GNSS_UART (UART_3) +#define GNSS_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 +#define GNSS_TX (UART3_RX_P15_7) // GPS TX串口引脚 + +#define ANGLE_TO_RAD(x) ( (x) * PI / 180.0 ) // 角度转换为弧度 +#define RAD_TO_ANGLE(x) ( (x) * 180.0 / PI ) // 弧度转换为角度 +#define PI ( 3.1415926535898 ) + +typedef enum +{ + TAU1201 = 1, // 逐飞科技双频GPS模块 + GN42A = 1, // 逐飞科技双频GPS模块 与TAU1201是一样的 + GN43RFA = 2, // 逐飞科技三频RTK模块 +}gps_device_enum; + +typedef struct +{ + uint16 year; + uint8 month; + uint8 day; + uint8 hour; + uint8 minute; + uint8 second; +}gps_time_struct; + +typedef struct +{ + gps_time_struct time; // 时间 + + uint8 state; // 有效状态 1:定位有效 0:定位无效 + + uint16 latitude_degree; // 度 + uint16 latitude_cent; // 分 + uint16 latitude_second; // 秒 这里的秒是被放大了100倍的,主要是避免使用浮点数 + uint16 longitude_degree; // 度 + uint16 longitude_cent; // 分 + uint16 longitude_second; // 秒 这里的秒是被放大了100倍的,主要是避免使用浮点数 + + double latitude; // 纬度 + double longitude; // 经度 + + int8 ns; // 纬度半球 N(北半球)或 S(南半球) + int8 ew; // 经度半球 E(东经)或 W(西经) + + float speed; // 速度(公里/每小时) + float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准)+ + uint8 antenna_direction_state; // 双天线测向有效状态 1:测向有效 0:测向无效,无效时antenna_direction数据是无效的 + float antenna_direction; // 主天线指向从天线与真北构成的夹角(000.0~359.9 度) + + // 下面两个个信息从GNGGA语句中获取 + uint8 satellite_used; // 用于定位的卫星数量 + float height; // 高度 +}gnss_info_struct; + +typedef enum +{ + GPS_STATE_RECEIVING, // 正在接收数据 + GPS_STATE_RECEIVED, // 数据接收完成 + GPS_STATE_PARSING, // 正在解析 +}gps_state_enum; + +extern gnss_info_struct gnss; +extern uint8 gnss_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); +uint8 gnss_data_parse (void); +void gnss_uart_callback (void); +void gnss_init (gps_device_enum gps_device); + +#endif diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_gps_tau1201.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_gps_tau1201.c deleted file mode 100644 index da46a99..0000000 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_gps_tau1201.c +++ /dev/null @@ -1,541 +0,0 @@ -/********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 -* Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 -* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 -* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* -* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 -* 甚至没有隐含的适销性或适合特定用途的保证 -* 更多细节请参见 GPL -* -* 您应该在收到本开源库的同时收到一份 GPL 的副本 -* 如果没有,请参阅 -* -* 额外注明: -* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 -* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 -* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 -* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* -* 文件名称 zf_device_gps_tau1201 -* 公司名称 成都逐飞科技有限公司 -* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D -* 店铺链接 https://seekfree.taobao.com/ -* -* 修改记录 -* 日期 作者 备注 -* 2022-09-15 pudding first version -* 2023-04-28 pudding 增加中文注释说明 -********************************************************************************************************************/ -/******************************************************************************************************************** -* 接线定义: -* ------------------------------------ -* 模块管脚 单片机管脚 -* RX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_RX 宏定义 -* TX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_TX 宏定义 -* VCC 3.3V电源 -* GND 电源地 -* ------------------------------------ -********************************************************************************************************************/ - -#include "math.h" -#include "zf_common_function.h" -#include "zf_common_fifo.h" -#include "zf_driver_delay.h" -#include "zf_driver_uart.h" - -#include "zf_device_gps_tau1201.h" - -#define GPS_TAU1201_BUFFER_SIZE ( 128 ) - -uint8 gps_tau1201_flag = 0; // 1:采集完成等待处理数据 0:没有采集完成 -gps_info_struct gps_tau1201; // GPS解析之后的数据 - -static uint8 gps_tau1201_state = 0; // 1:GPS初始化完成 -static fifo_obj_struct gps_tau1201_receiver_fifo; // -static uint8 gps_tau1201_receiver_buffer[GPS_TAU1201_BUFFER_SIZE]; // 数据存放数组 - -gps_state_enum gps_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 -gps_state_enum gps_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 - -static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; // GGA语句缓冲区 -static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; // RMC语句缓冲区 - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 获取指定 ',' 后面的索引 -// 参数说明 num 第几个逗号 -// 参数说明 *str 字符串 -// 返回参数 uint8 返回索引 -// 使用示例 get_parameter_index(1, s); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static uint8 get_parameter_index (uint8 num, char *str) -{ - uint8 i = 0, j = 0; - char *temp = strchr(str, '\n'); - uint8 len = 0, len1 = 0; - - 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; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 给定字符串第一个 ',' 之前的数据转换为int -// 参数说明 *s 字符串 -// 返回参数 float 返回数值 -// 使用示例 get_int_number(&buf[get_parameter_index(7, buf)]); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static int get_int_number (char *s) -{ - char buf[10]; - uint8 i = 0; - int return_value = 0; - i = get_parameter_index(1, s); - i = i - 1; - strncpy(buf, s, i); - buf[i] = 0; - return_value = func_str_to_int(buf); - return return_value; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 给定字符串第一个 ',' 之前的数据转换为float -// 参数说明 *s 字符串 -// 返回参数 float 返回数值 -// 使用示例 get_float_number(&buf[get_parameter_index(8, buf)]); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static float get_float_number (char *s) -{ - uint8 i = 0; - char buf[15]; - float return_value = 0; - - i = get_parameter_index(1, s); - i = i - 1; - strncpy(buf, s, i); - buf[i] = 0; - return_value = (float)func_str_to_double(buf); - return return_value; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 给定字符串第一个 ',' 之前的数据转换为double -// 参数说明 *s 字符串 -// 返回参数 double 返回数值 -// 使用示例 get_double_number(&buf[get_parameter_index(3, buf)]); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static double get_double_number (char *s) -{ - uint8 i = 0; - char buf[15]; - double return_value = 0; - - i = get_parameter_index(1, s); - i = i - 1; - strncpy(buf, s, i); - buf[i] = 0; - return_value = func_str_to_double(buf); - return return_value; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 世界时间转换为北京时间 -// 参数说明 *time 保存的时间 -// 返回参数 void -// 使用示例 utc_to_btc(&gps->time); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static void utc_to_btc (gps_time_struct *time) -{ - uint8 day_num = 0; - - time->hour = time->hour + 8; - if(23 < time->hour) - { - time->hour -= 24; - time->day += 1; - - if(2 == time->month) - { - day_num = 28; - if((0 == time->year % 4 && 0 != time->year % 100) || 0 == time->year % 400) // 判断是否为闰年 - { - day_num ++; // 闰月 2月为29天 - } - } - else - { - day_num = 31; // 1 3 5 7 8 10 12这些月份为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(12 < time->month) - { - time->month -= 12; - time->year ++; - } - } - } -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 RMC语句解析 -// 参数说明 *line 接收到的语句信息 -// 参数说明 *gps 保存解析后的数据 -// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 -// 使用示例 gps_gnrmc_parse((char *)data_buffer, &gps_tau1201); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static uint8 gps_gnrmc_parse (char *line, gps_info_struct *gps) -{ - uint8 state = 0, temp = 0; - - double latitude = 0; // 纬度 - double longitude = 0; // 经度 - - double lati_cent_tmp = 0, lati_second_tmp = 0; - double long_cent_tmp = 0, long_second_tmp = 0; - float speed_tmp = 0; - char *buf = line; - uint8 return_state = 0; - - state = buf[get_parameter_index(2, buf)]; - - gps->state = 0; - if('A' == state) // 如果数据有效 则解析数据 - { - return_state = 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; // 纬度转换为度分秒 - lati_cent_tmp = (latitude - gps->latitude_degree * 100); - gps->latitude_cent = (int)lati_cent_tmp; - lati_second_tmp = (lati_cent_tmp - gps->latitude_cent) * 6000; - gps->latitude_second = (int)lati_second_tmp; - - gps->longitude_degree = (int)longitude / 100; // 经度转换为度分秒 - long_cent_tmp = (longitude - gps->longitude_degree * 100); - gps->longitude_cent = (int)long_cent_tmp; - long_second_tmp = (long_cent_tmp - gps->longitude_cent) * 6000; - gps->longitude_second = (int)long_second_tmp; - - gps->latitude = gps->latitude_degree + lati_cent_tmp / 60; - gps->longitude = gps->longitude_degree + long_cent_tmp / 60; - - speed_tmp = get_float_number(&buf[get_parameter_index(7, buf)]); // 速度(海里/小时) - gps->speed = speed_tmp * 1.85f; // 转换为公里/小时 - gps->direction = get_float_number(&buf[get_parameter_index(8, buf)]); // 角度 - } - - // 在定位没有生效前也是有时间数据的,可以直接解析 - gps->time.hour = (buf[7] - '0') * 10 + (buf[8] - '0'); // 时间 - 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'); // 日期 - 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_state; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 GGA语句解析 -// 参数说明 *line 接收到的语句信息 -// 参数说明 *gps 保存解析后的数据 -// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 -// 使用示例 gps_gngga_parse((char *)data_buffer, &gps_tau1201); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static uint8 gps_gngga_parse (char *line, gps_info_struct *gps) -{ - uint8 state = 0; - char *buf = line; - uint8 return_state = 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)]); // 高度 = 海拔高度 + 地球椭球面相对大地水准面的高度 - return_state = 1; - } - - return return_state; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 计算从第一个点到第二个点的距离 -// 参数说明 latitude1 第一个点的纬度 -// 参数说明 longitude1 第一个点的经度 -// 参数说明 latitude2 第二个点的纬度 -// 参数说明 longitude2 第二个点的经度 -// 返回参数 double 返回两点距离 -// 使用示例 get_two_points_distance(latitude1_1, longitude1, latitude2, longitude2); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -double get_two_points_distance (double latitude1, double longitude1, double latitude2, double longitude2) -{ - const double EARTH_RADIUS = 6378137; // 地球半径(单位:m) - double rad_latitude1 = 0; - double rad_latitude2 = 0; - double rad_longitude1 = 0; - double rad_longitude2 = 0; - double distance = 0; - double a = 0; - double b = 0; - - rad_latitude1 = ANGLE_TO_RAD(latitude1); // 根据角度计算弧度 - 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 里面实现的算法 - distance = distance * EARTH_RADIUS; - - return distance; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 计算从第一个点到第二个点的方位角 -// 参数说明 latitude1 第一个点的纬度 -// 参数说明 longitude1 第一个点的经度 -// 参数说明 latitude2 第二个点的纬度 -// 参数说明 longitude2 第二个点的经度 -// 返回参数 double 返回方位角(0至360) -// 使用示例 get_two_points_azimuth(latitude1_1, longitude1, latitude2, longitude2); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -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 ((0 < angle) ? angle : (angle + 360)); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 解析GPS数据 -// 参数说明 void -// 返回参数 uint8 0-解析成功 1-解析失败 可能数据包错误 -// 使用示例 gps_data_parse(); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -uint8 gps_data_parse (void) -{ - uint8 return_state = 0; - uint8 check_buffer[5] = {'0', 'x', 0x00, 0x00, 0x00}; - uint8 bbc_xor_origin = 0; - uint8 bbc_xor_calculation = 0; - uint32 data_len = 0; - - do - { - if(GPS_STATE_RECEIVED == gps_rmc_state) - { - gps_rmc_state = GPS_STATE_PARSING; - strncpy((char *)&check_buffer[2], strchr((const char *)gps_rmc_buffer, '*') + 1, 2); - bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); - for(bbc_xor_calculation = gps_rmc_buffer[1], data_len = 2; '*' != gps_rmc_buffer[data_len]; data_len ++) - { - bbc_xor_calculation ^= gps_rmc_buffer[data_len]; - } - if(bbc_xor_calculation != bbc_xor_origin) - { - // 数据校验失败 - return_state = 1; - break; - } - - gps_gnrmc_parse((char *)gps_rmc_buffer, &gps_tau1201); - } - gps_rmc_state = GPS_STATE_RECEIVING; - - if(GPS_STATE_RECEIVED == gps_gga_state) - { - gps_gga_state = GPS_STATE_PARSING; - strncpy((char *)&check_buffer[2], strchr((const char *)gps_gga_buffer, '*') + 1, 2); - bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); - - for(bbc_xor_calculation = gps_gga_buffer[1], data_len = 2; '*' != gps_gga_buffer[data_len]; data_len ++) - { - bbc_xor_calculation ^= gps_gga_buffer[data_len]; - } - if(bbc_xor_calculation != bbc_xor_origin) - { - // 数据校验失败 - return_state = 1; - break; - } - - gps_gngga_parse((char *)gps_gga_buffer, &gps_tau1201); - } - gps_gga_state = GPS_STATE_RECEIVING; - - }while(0); - return return_state; -} - - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 GPS串口回调函数 -// 参数说明 void -// 返回参数 void -// 使用示例 gps_uart_callback(); -// 备注信息 此函数需要在串口接收中断内进行调用 -//------------------------------------------------------------------------------------------------------------------- -void gps_uart_callback (void) -{ - uint8 temp_gps[6]; - uint32 temp_length = 0; - - if(gps_tau1201_state) - { - uint8 dat; - while(uart_query_byte(GPS_TAU1201_UART, &dat)) - { - fifo_write_buffer(&gps_tau1201_receiver_fifo, &dat, 1); - } - - if('\n' == dat) - { - // 读取前6个数据 用于判断语句类型 - temp_length = 6; - fifo_read_buffer(&gps_tau1201_receiver_fifo, temp_gps, &temp_length, FIFO_READ_ONLY); - - // 根据不同类型将数据拷贝到不同的缓冲区 - if(0 == strncmp((char *)&temp_gps[3], "RMC", 3)) - { - // 如果没有在解析数据则更新缓冲区的数据 - if(GPS_STATE_PARSING != gps_rmc_state) - { - gps_rmc_state = GPS_STATE_RECEIVED; - temp_length = fifo_used(&gps_tau1201_receiver_fifo); - fifo_read_buffer(&gps_tau1201_receiver_fifo, gps_rmc_buffer, &temp_length, FIFO_READ_AND_CLEAN); - } - } - else if(0 == strncmp((char *)&temp_gps[3], "GGA", 3)) - { - // 如果没有在解析数据则更新缓冲区的数据 - if(GPS_STATE_PARSING != gps_gga_state) - { - gps_gga_state = GPS_STATE_RECEIVED; - temp_length = fifo_used(&gps_tau1201_receiver_fifo); - fifo_read_buffer(&gps_tau1201_receiver_fifo, gps_gga_buffer, &temp_length, FIFO_READ_AND_CLEAN); - } - } - - // 统一将FIFO清空 - fifo_clear(&gps_tau1201_receiver_fifo); - - gps_tau1201_flag = 1; - } - } -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 GPS初始化 -// 参数说明 void -// 返回参数 void -// 使用示例 gps_init(); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -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}; - - fifo_init(&gps_tau1201_receiver_fifo, FIFO_DATA_8BIT, gps_tau1201_receiver_buffer, GPS_TAU1201_BUFFER_SIZE); - system_delay_ms(500); // 等待GPS启动后开始初始化 - uart_init(GPS_TAU1201_UART, 115200, GPS_TAU1201_RX, GPS_TAU1201_TX); - uart_rx_interrupt(GPS_TAU1201_UART, 0); - - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)set_rate, sizeof(set_rate)); // 设置GPS更新速率为10hz 如果不调用此语句则默认为1hz - system_delay_ms(200); - - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)open_rmc, sizeof(open_rmc)); // 开启rmc语句 - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)open_gga, sizeof(open_gga)); // 开启gga语句 - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gll, sizeof(close_gll)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gsa, sizeof(close_gsa)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_grs, sizeof(close_grs)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gsv, sizeof(close_gsv)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_vtg, sizeof(close_vtg)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_zda, sizeof(close_zda)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gst, sizeof(close_gst)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_txt, sizeof(close_txt)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_txt_ant, sizeof(close_txt_ant)); - system_delay_ms(50); - - gps_tau1201_state = 1; - uart_rx_interrupt(GPS_TAU1201_UART, 1); -} diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_gps_tau1201.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_gps_tau1201.h deleted file mode 100644 index c167bae..0000000 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_gps_tau1201.h +++ /dev/null @@ -1,117 +0,0 @@ -/********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 -* Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 -* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 -* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* -* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 -* 甚至没有隐含的适销性或适合特定用途的保证 -* 更多细节请参见 GPL -* -* 您应该在收到本开源库的同时收到一份 GPL 的副本 -* 如果没有,请参阅 -* -* 额外注明: -* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 -* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 -* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 -* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* -* 文件名称 zf_device_gps_tau1201 -* 公司名称 成都逐飞科技有限公司 -* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D -* 店铺链接 https://seekfree.taobao.com/ -* -* 修改记录 -* 日期 作者 备注 -* 2022-09-15 pudding first version -* 2023-04-28 pudding 增加中文注释说明 -********************************************************************************************************************/ -/******************************************************************************************************************** -* 接线定义: -* ------------------------------------ -* 模块管脚 单片机管脚 -* RX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_RX 宏定义 -* TX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_TX 宏定义 -* VCC 3.3V电源 -* GND 电源地 -* ------------------------------------ -********************************************************************************************************************/ - -#ifndef _zf_device_gps_tau1201_h_ -#define _zf_device_gps_tau1201_h_ - -#include "zf_common_typedef.h" - -//=================================================定义 定位模块 基本配置================================================ -#define GPS_TAU1201_UART (UART_3) -#define GPS_TAU1201_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 -#define GPS_TAU1201_TX (UART3_RX_P15_7) // GPS TX串口引脚 - -#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 -#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 -#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; // 时间- - uint8 state; // 有效状态 1:定位有效 0:定位无效 - uint16 latitude_degree; // 度 - uint16 latitude_cent; // 分 - uint16 latitude_second; // 秒 - uint16 longitude_degree; // 度 - uint16 longitude_cent; // 分 - uint16 longitude_second; // 秒 - double latitude; // 纬度 - double longitude; // 经度 - int8 ns; // 纬度半球 N(北半球)或 S(南半球) - int8 ew; // 经度半球 E(东经)或 W(西经) - float speed; // 速度(公里/每小时) - float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) - // 下面两个个信息从GNGGA语句中获取 - uint8 satellite_used; // 用于定位的卫星数量 - float height; // 高度 -}gps_info_struct; - -typedef enum -{ - GPS_STATE_RECEIVING, // 正在接收数据 - GPS_STATE_RECEIVED, // 数据接收完成 - GPS_STATE_PARSING, // 正在解析 -}gps_state_enum; -//================================================定义 定位模块 参数结构体================================================ - - -//=================================================声明 定位模块 全局变量================================================ -extern gps_info_struct gps_tau1201; // GPS解析之后的数据 -extern uint8 gps_tau1201_flag; // 1:采集完成等待处理数据 0:没有采集完成 -//=================================================声明 定位模块 全局变量================================================ - - -//=================================================声明 定位模块 基础函数================================================ -double get_two_points_distance (double lat1, double lng1, double lat2, double lng2); // 计算从第一个点到第二个点的距离(单位:m) -double get_two_points_azimuth (double lat1, double lon1, double lat2, double lon2); // 计算从第一个点到第二个点的方位角(单位:°) -uint8 gps_data_parse (void); // 解析GPS数据 -void gps_uart_callback (void); // GPS回调函数 -void gps_init (void); // GPS初始化 -//=================================================声明 定位模块 基础函数================================================ -#endif diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_icm20602.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_icm20602.c index f4ae830..ddebf3c 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_icm20602.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_icm20602.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_icm20602 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_icm20602.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_icm20602.h index 67724ad..209972b 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_icm20602.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_icm20602.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_icm20602 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_imu660ra.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_imu660ra.c index 95144f9..02fdb9e 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_imu660ra.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_imu660ra.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu660ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_imu660ra.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_imu660ra.h index a689df1..348e6a1 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_imu660ra.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_imu660ra.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu660ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_imu963ra.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_imu963ra.c index 92ec0f6..595142a 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_imu963ra.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_imu963ra.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu963ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_imu963ra.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_imu963ra.h index 4d0d9f9..c0f981f 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_imu963ra.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_imu963ra.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu963ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ips114.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ips114.c index 78c6f3b..b13e338 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ips114.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ips114.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips114 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ips114.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ips114.h index 81dfc3c..ba932b1 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ips114.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ips114.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips114 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ips200.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ips200.c index cd8681f..37d9d04 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ips200.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ips200.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips200 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ips200.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ips200.h index ce59927..045bf27 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ips200.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ips200.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips200 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_key.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_key.c index 9e42c8a..8b240cb 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_key.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_key.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_key * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_key.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_key.h index bcab8aa..9c653cf 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_key.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_key.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_key * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_mpu6050.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_mpu6050.c index dc3c5b2..101a5ae 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_mpu6050.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_mpu6050.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_mpu6050 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_mpu6050.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_mpu6050.h index 3510e06..c8a086f 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_mpu6050.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_mpu6050.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_mpu6050 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_mt9v03x.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_mt9v03x.c index 231cfec..d38b8df 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_mt9v03x.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_mt9v03x.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_mt9v03x * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_mt9v03x.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_mt9v03x.h index 7786bc5..9d4650d 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_mt9v03x.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_mt9v03x.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_mt9v03x * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_oled.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_oled.c index 5314209..55aefa7 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_oled.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_oled.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_oled * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_oled.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_oled.h index d52d2fd..aadf048 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_oled.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_oled.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_oled * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ov7725.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ov7725.c index 12f6095..bac95fe 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ov7725.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ov7725.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ov7725 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ov7725.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ov7725.h index f45a4e8..2cb4026 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ov7725.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ov7725.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ov7725 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_scc8660.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_scc8660.c index 3483c93..38d65ff 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_scc8660.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_scc8660.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_scc8660 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_scc8660.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_scc8660.h index 815d272..537283a 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_scc8660.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_scc8660.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_scc8660 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_tft180.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_tft180.c index db50824..b661e91 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_tft180.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_tft180.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_tft180 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_tft180.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_tft180.h index 47491ee..54a72b3 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_tft180.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_tft180.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_tft180 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_tsl1401.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_tsl1401.c index 3f9db7f..d133c7c 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_tsl1401.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_tsl1401.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_tsl1401 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_tsl1401.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_tsl1401.h index 1fab12e..a7b061c 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_tsl1401.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_tsl1401.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_tsl1401 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_type.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_type.c index 497ba55..af24701 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_type.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_type.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_type * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -32,6 +32,7 @@ * 日期 作者 备注 * 2022-09-15 pudding first version * 2023-05-26 pudding 新增SPI WIFI 中断回调指针 +* 2024-01-16 pudding 移除SPI WIFI 中断回调指针 SPI WIFI将不再使用外部 ********************************************************************************************************************/ #include "zf_device_type.h" @@ -45,7 +46,6 @@ callback_function camera_dma_handler = type_default_callback; wireless_type_enum wireless_type = NO_WIRELESS; callback_function wireless_module_uart_handler = type_default_callback; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 -callback_function wireless_module_spi_handler = type_default_callback; // WIFI SPI GPIO中断函数指针,根据初始化时设置的函数进行跳转 tof_type_enum tof_type = NO_TOF; callback_function tof_module_exti_handler = type_default_callback; // ToF 模块 INT 更新中断 @@ -54,7 +54,7 @@ callback_function tof_module_exti_handler = type_default_callback; // 函数简介 默认回调函数 // 参数说明 void // 返回参数 void -// 使用示例 +// 使用示例 // 备注信息 保护性冗余设计 防止在没有初始化设备的时候跑飞 //------------------------------------------------------------------------------------------------------------------- static void type_default_callback (void) @@ -90,14 +90,7 @@ void set_camera_type (camera_type_enum type_set, callback_function vsync_callba void set_wireless_type (wireless_type_enum type_set, callback_function wireless_callback) { wireless_type = type_set; - if(WIFI_SPI == wireless_type) - { - wireless_module_spi_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); - } - else - { - wireless_module_uart_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); - } + wireless_module_uart_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); } //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_type.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_type.h index 19c36ca..3b124fe 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_type.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_type.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_type * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -56,7 +56,6 @@ typedef enum WIRELESS_UART, // 无线串口 BLUETOOTH_CH9141, // 蓝牙 CH9141 WIFI_UART, // 串口 WiFi - WIFI_SPI // SPI WiFi }wireless_type_enum; typedef enum diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c index 2bdb164..3cbc786 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_virtual_oscilloscope * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h index f518026..b0fd085 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_virtual_oscilloscope * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_wifi_spi.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_wifi_spi.c index 78a6d68..f9e51ca 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_wifi_spi.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_wifi_spi.c @@ -24,14 +24,13 @@ * 文件名称 zf_device_wifi_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 * 日期 作者 备注 -* 2023-05-27 pudding first version -* 2023-05-29 pudding 新增关闭休眠指令,提升通讯效率 +* 2022-09-21 SeekFree first version ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,1374 +52,615 @@ #include "zf_common_clock.h" #include "zf_common_debug.h" #include "zf_common_fifo.h" -#include "zf_common_function.h" #include "zf_driver_delay.h" #include "zf_driver_gpio.h" -#include "zf_common_interrupt.h" -#include "zf_driver_exti.h" #include "zf_driver_spi.h" #include "zf_device_type.h" #include "zf_device_wifi_spi.h" -#define WAIT_TIME_OUT (10000) // 单指令等待时间 单位:ms +#define WIFI_CONNECT_TIME_OUT 10000 // 单位毫秒 +#define SOCKET_CONNECT_TIME_OUT 50000 // 单位毫秒 +#define OTHER_TIME_OUT 1000 // 单位毫秒 -#define WIFI_SPI_WRITE_MAX 128 // 定义一次SPI通讯最大发送的数据长度 - -#define WIFI_SPI_WRITE_REQUEST 0x01 -#define WIFI_SPI_CHECK_STATE 0x02 -#define WIFI_SPI_WRITE_DATA 0x03 -#define WIFI_SPI_READ_DATA 0x04 -#define WIFI_SPI_WRITE_END 0x07 -#define WIFI_SPI_READ_END 0x08 - -#define WIFI_SPI_WRITE_ADDR 0x00 -#define WIFI_SPI_STATE_ADDR 0x04 +char wifi_spi_version[12]; // 保存模块固件版本信息 +char wifi_spi_mac_addr[20]; // 保存模块MAC地址信息 +char wifi_spi_ip_addr_port[25]; // 保存模块IP地址与端口信息 -volatile wifi_spi_buffer_state_enum wifi_buffer_state; -volatile wifi_spi_transmit_state_enum wifi_transmit_state; - -static fifo_obj_struct wifi_spi_fifo; -static uint8 wifi_spi_buffer[WIFI_SPI_BUFFER_SIZE]; // 数据存放数组 - -vuint8 wifi_spi_ack_flag = 0; // 0:模块未应答 1:模块已应答 -uint8 wifi_spi_init_flag; // 0:模块未初始化成功或者未连接 1:模块已连接并成功初始化 -vuint8 wifi_spi_packet_num; // 发送的数据包ID -vuint32 wifi_spi_send_remain_length; // 剩余的发送长度 - - - -wifi_spi_information_struct wifi_spi_information; +static fifo_struct wifi_spi_fifo; +static uint8 wifi_spi_buffer[WIFI_SPI_RECVIVE_FIFO_SIZE]; +static volatile wifi_spi_state_enum wifi_spi_mutex; //------------------------------------------------------------------------------------------------------------------- -// 函数简介 请求写入数据到模块 -// 参数说明 length 需要写入的长度 -// @return void -// Sample usage: +// 函数简介 等待WIFI SPI就绪 +// 参数说明 wait_time 最大等待时间 单位毫秒 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_write_request(uint16 length) +static uint8 wifi_spi_wait_idle (uint32 wait_time) { - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_REQUEST; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - head.magic = 0xFE; - head.sequence = wifi_spi_packet_num++; - head.length = length; + uint32 time = 0; - wifi_transmit_state = TRANSMIT_WRITE_REQUEST; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 7); - gpio_set_level(WIFI_SPI_CS_PIN, 1); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 读取模块状态 -// 参数说明 *length 需要读取或者写入的长度 -// @return WIFI_SPI_BUFFER_STATE_enum 模块状态 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static wifi_spi_buffer_state_enum wifi_spi_read_state(uint16 *length) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_CHECK_STATE; - head.addr = WIFI_SPI_STATE_ADDR; - head.dummy = 0x00; - - wifi_spi_ack_flag = 0; - wifi_transmit_state = TRANSMIT_READ_STATE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_transfer_8bit(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, &head.cmd, 7); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - - if(BUFFER_WRITE == head.magic) + wait_time = wait_time*100; + while(0 == gpio_get_level(WIFI_SPI_INT_PIN)) { - wifi_spi_packet_num = head.sequence; - } - *length = head.length; - - return (wifi_spi_buffer_state_enum)head.magic; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据发送完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_done(void) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_END; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_transmit_state = TRANSMIT_IDLE; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据接收完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_start(void) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_READ_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - wifi_transmit_state = TRANSMIT_READ; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据接收完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_done(void) -{ - wifi_spi_buffer_struct head; - - gpio_set_level(WIFI_SPI_CS_PIN, 1); - - head.cmd = WIFI_SPI_READ_END; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_transmit_state = TRANSMIT_IDLE; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块 -// 参数说明 *buff 需要写入数据的首地址 -// 参数说明 length 需要写入数据的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_data(const uint8 *buff, uint16 length) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - wifi_transmit_state = TRANSMIT_WRITE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - spi_write_8bit_array(WIFI_SPI_INDEX, buff, length); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_spi_send_done(); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_data_multi(wifi_spi_send_multi_struct *multi_buffer) -{ - uint8 i; - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - wifi_transmit_state = TRANSMIT_WRITE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - - for(i = 0; i < WIFI_SPI_MAX_MULTI; i++) - { - if(NULL != multi_buffer->source[i]) spi_write_8bit_array(WIFI_SPI_INDEX, multi_buffer->source[i], multi_buffer->length[i]); - } - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_spi_send_done(); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 接收模块发送的数据 -// 参数说明 *buff 接收数组的缓冲区首地址 -// 参数说明 length 需要接收的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_data(uint8 *buff, uint16 length) -{ - spi_read_8bit_array(WIFI_SPI_INDEX, buff, length); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送命令到模块 -// 参数说明 *str 命令字符串首地址 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_command(const char *str) -{ - uint8 state = 0; - uint16 send_length; - uint16 wait_time = 0; - - // 请求发送数据 - send_length = (uint16)strlen(str); - - // 等待传输进入空闲 - while(TRANSMIT_IDLE != wifi_transmit_state); - - // 如果没有进入发送状态则重新请求发送数据 - while(BUFFER_WRITE != wifi_buffer_state) - { - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - while(!wifi_spi_ack_flag) - { - wait_time++; - if((WAIT_TIME_OUT / 4) <= wait_time) - { - state = 1; - wifi_spi_init_flag = 0; // 模块已断开 - break; - } - system_delay_ms(1); - } - - if(1 == state) + system_delay_us(10); + time++; + if(wait_time <= time) { break; } } - - wifi_buffer_state = BUFFER_IDLE; - - if(0 == state) // 通讯未超时 - { - wifi_spi_send_remain_length = send_length; - // 发送消息 - wifi_spi_send_data((const uint8 *)str, send_length); - } + return (wait_time <= time); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 检查模块状态并读取模块发送的数据 -// 参数说明 void -// @return void -// Sample usage: +// 函数简介 写入数据到WIFI SPI +// 参数说明 *buffer1 第一组需要发送的数据缓冲区地址 +// 参数说明 length1 第一组数据长度 +// 参数说明 *buffer2 第二组需要发送的数据缓冲区地址 +// 参数说明 length2 第二组数据长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -void wifi_spi_check_state_read_buffer(void) +static void wifi_spi_write (const uint8 *buffer1, uint16 length1, const uint8 *buffer2, uint16 length2) { - uint16 wifi_spi_receive_length; // 本次接收到的数据数量 - uint8 wifi_spi_receive_buffer[WIFI_SPI_WRITE_MAX]; - - // 查询WIFI模块的状态 - wifi_buffer_state = wifi_spi_read_state(&wifi_spi_receive_length); - - // 如果需要读取WIFI模块数据,则保存需要读取的长度 - if(BUFFER_READ == wifi_buffer_state) + gpio_low(WIFI_SPI_CS_PIN); + if(NULL != buffer1) { - wifi_spi_receive_start(); - do - { - if(wifi_spi_receive_length > WIFI_SPI_WRITE_MAX) - { - wifi_spi_receive_data((uint8 *)wifi_spi_receive_buffer, WIFI_SPI_WRITE_MAX); - fifo_write_buffer(&wifi_spi_fifo, wifi_spi_receive_buffer, WIFI_SPI_WRITE_MAX); // 存入 FIFO - wifi_spi_receive_length = wifi_spi_receive_length - WIFI_SPI_WRITE_MAX; - } - else - { - wifi_spi_receive_data((uint8 *)wifi_spi_receive_buffer, wifi_spi_receive_length); - fifo_write_buffer(&wifi_spi_fifo, wifi_spi_receive_buffer, wifi_spi_receive_length); // 存入 FIFO - wifi_spi_receive_length = 0; - } - }while(wifi_spi_receive_length > 0); - wifi_spi_receive_done(); + spi_write_8bit_array(WIFI_SPI_INDEX, buffer1, length1); } - else if(BUFFER_IDLE == wifi_buffer_state) + if(NULL != buffer2) { - // 如果模块内部缓冲区状态为空闲,则传输状态也设置为空闲 - wifi_transmit_state = TRANSMIT_IDLE; + spi_write_8bit_array(WIFI_SPI_INDEX, buffer2, length2); } + gpio_high(WIFI_SPI_CS_PIN); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块 -// 参数说明 *buff 需要发送的数据首地址 -// 参数说明 length 需要发送的长度 -// @return uint32 剩余未发送长度 -// Sample usage: +// 函数简介 WIFI SPI 发送与接收同时进行(命令收发) +// 参数说明 *packets 发送与接收的地址 +// 参数说明 length 需要接收的长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_write_data(const uint8 *buff, uint32 length) +static void wifi_spi_transfer_command (wifi_spi_packets_struct *packets, uint16 length) { - uint16 send_length; - uint32 wait_time; + gpio_low(WIFI_SPI_CS_PIN); - // 记录需要发送的长度 - wifi_spi_send_remain_length = length; - - while(wifi_spi_send_remain_length) + spi_transfer_8bit(WIFI_SPI_INDEX, (uint8 *)&(packets->head), (uint8 *)&(packets->head), sizeof(wifi_spi_head_struct)); + + if(length) { - send_length = (uint16)func_limit_ab(wifi_spi_send_remain_length, 1, WIFI_SPI_WRITE_MAX); - - // 请求发送数据 - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - - // 最长等待5秒 - wait_time = 5000; - while(!wifi_spi_ack_flag) - { - wait_time--; - if(0 == wait_time) break; - system_delay_ms(1); - } - - if(BUFFER_WRITE == wifi_buffer_state) - { - // 发送消息 - wifi_spi_send_data(buff, send_length); - buff += send_length; - wifi_spi_send_remain_length -= send_length; - wifi_buffer_state = BUFFER_IDLE; - } - else - { - break; - } + spi_transfer_8bit(WIFI_SPI_INDEX, (const uint8 *)(packets->buffer), packets->buffer, length); } - - return wifi_spi_send_remain_length; + + gpio_high(WIFI_SPI_CS_PIN); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// @return uint32 剩余未发送长度 -// Sample usage: 发送数据总长度不能超过4092个 +// 函数简介 WIFI SPI 发送与接收同时进行(数据收发) +// 参数说明 *write_data 发送的数据缓冲区地址 +// 参数说明 *read_data 接收到的数据的存储地址 +// 参数说明 length 需要接收的长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_write_data_multi(wifi_spi_send_multi_struct *multi_buffer) +static void wifi_spi_transfer_data (const uint8 *write_data, wifi_spi_packets_struct *read_data, uint16 length) { - uint16 send_length; - uint32 wait_time; + gpio_low(WIFI_SPI_CS_PIN); - // 记录需要发送的长度 - send_length = multi_buffer->length[0] + multi_buffer->length[1] + multi_buffer->length[2] + multi_buffer->length[3] + multi_buffer->length[4] + multi_buffer->length[5] + multi_buffer->length[6] + multi_buffer->length[7]; + read_data->head.command = WIFI_SPI_DATA; + read_data->head.length = length; - if(WIFI_SPI_WRITE_MAX >= send_length) + spi_transfer_8bit(WIFI_SPI_INDEX, (uint8 *)&(read_data->head), (uint8 *)&(read_data->head), sizeof(wifi_spi_head_struct)); + + if(WIFI_SPI_RECVIVE_SIZE < length) { - // 请求发送数据 - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - - // 最长等待5秒 - wait_time = 5000; - while(!wifi_spi_ack_flag) - { - wait_time--; - if(0 == wait_time) break; - system_delay_ms(1); - } - - if(BUFFER_WRITE == wifi_buffer_state) - { - // 发送消息 - wifi_spi_send_data_multi(multi_buffer); - send_length = 0; - wifi_buffer_state = BUFFER_IDLE; - } + spi_transfer_8bit(WIFI_SPI_INDEX, write_data, read_data->buffer, WIFI_SPI_RECVIVE_SIZE); + spi_write_8bit_array(WIFI_SPI_INDEX, &write_data[WIFI_SPI_RECVIVE_SIZE], length - WIFI_SPI_RECVIVE_SIZE); } - - return send_length; + else + { + // 将需要发送的数据拷贝到读取缓冲区,避免出现write_data越界访问 + memcpy(read_data->buffer, write_data, length); + spi_transfer_8bit(WIFI_SPI_INDEX, read_data->buffer, read_data->buffer, WIFI_SPI_RECVIVE_SIZE); + } + gpio_high(WIFI_SPI_CS_PIN); } -//-------------------------------------------------------------------------------------------------- -// 函数简介 等待模块响应 -// 参数说明 *wait_buffer 等待的响应的字符串 -// 参数说明 timeout 超时时间 -// 返回参数 uint8 0:模块响应指定数据 1:模块未响应指定数据或超时 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_wait_ack (char *wait_buffer, uint32 timeout) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 参数设置 +// 参数说明 command 命令类型 +// 参数说明 *buffer 参数地址 +// 参数说明 length 参数长度 +// 参数说明 wait_time 最大等待时间 单位100微妙 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_set_parameter (wifi_spi_packets_command_enum command, uint8 *buffer, uint16 length, uint32 wait_time) { - uint8 return_state = 1; - char receiver_buffer[8] = {0, 0, 0, 0, 0, 0, 0, 0}; - uint32 receiver_len = 8; - + uint8 return_state; + wifi_spi_head_struct head; + return_state = 1; do { - system_delay_ms(1); - // 判断接收缓冲区内是否有需要响应的指定数据 如果有 则跳出循环并且返回0 - receiver_len = 8; - fifo_read_tail_buffer(&wifi_spi_fifo, (uint8 *)receiver_buffer, &receiver_len, FIFO_READ_ONLY); + head.command = command; + head.length = length; + + // 等待从机准备就绪 + if(wifi_spi_wait_idle(wait_time)) + { + break; + } - if(strstr(receiver_buffer, wait_buffer)) + wifi_spi_write(&head.command, sizeof(wifi_spi_head_struct), buffer, length); + if(wifi_spi_wait_idle(wait_time)) + { + break; + } + // 接收应答信号 + + head.command = WIFI_SPI_DATA; + head.length = 0; + wifi_spi_transfer_command((wifi_spi_packets_struct *)&head, head.length); + system_delay_us(20); + if(WIFI_SPI_REPLY_OK == head.command) { return_state = 0; - break; } - else if(strstr(receiver_buffer, "ERROR") || strstr(receiver_buffer, "busy")) - { - // 如果接收到报错或者模块忙 则跳出循环并且返回1 - return_state = 1; - break; - } - }while(timeout --); + }while(0); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 清除WiFi接收缓冲区内容 -// 参数说明 void -// 返回参数 void -// 使用示例 wifi_spi_clear_receive_buffer(); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static void wifi_spi_clear_receive_buffer (void) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 模块信息获取 +// 参数说明 command 命令类型 +// 参数说明 *buffer 保存接收到的参数地址 +// 参数说明 wait_time 最大等待时间 单位100微妙 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_parameter (wifi_spi_packets_command_enum command, wifi_spi_packets_struct *read_data, uint32 wait_time) { - // 清空WiFi接收缓冲区 - fifo_clear(&wifi_spi_fifo); -} + uint8 return_state; -//-------------------------------------------------------------------------------------------------- -// 函数简介 模块数据解析 -// 参数说明 *target_buffer 目标存放地址指针 字符串数组 -// 参数说明 *origin_buffer 数据来源地址指针 字符串数组 -// 参数说明 start_char 起始提取字节 例如从 "1234" 中从 '2' 开始提取 就应该填入 '2' -// 参数说明 end_char 结束提取字节 例如从 "1234" 中在 '4' 结束提取 就应该填入 '\0'(0x00 空字符 一般是字符串结尾) -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_data_parse(wifi_spi_information.mac, wifi_spi_receive_buffer, '"', '"'); // 调用获取本机mac地址后,调用此函数提取mac地址 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char start_char, char end_char) -{ - uint8 return_state = 0; - char *location1; - char *location2; - location1 = strchr((char *)origin_buffer, start_char); - if(location1) + return_state = 1; + do { - location1 ++; - location2 = strchr(location1, end_char); - if(location2) + // 等待从机准备就绪 + if(wifi_spi_wait_idle(wait_time)) { - memcpy(target_buffer, location1, location2-location1); + break; } - else + read_data->head.command = command; + wifi_spi_write(&(read_data->head.command), WIFI_SPI_RECVIVE_SIZE, NULL, 0); + + if(wifi_spi_wait_idle(wait_time)) { - return_state = 1; + break; } - } - else - { - return_state = 1; - } + read_data->head.command = WIFI_SPI_DATA; + read_data->head.length = 0; + wifi_spi_transfer_command(read_data, WIFI_SPI_RECVIVE_SIZE); + return_state = 0; + }while(0); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 查看模块版本信息 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_get_version(); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 固件版本获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,固件版本信息以字符串形式保存在wifi_spi_version数组中 +//------------------------------------------------------------------------------------------------------------------- static uint8 wifi_spi_get_version (void) { - char *location1; - uint8 return_state = 0; - uint8 receiver_buffer[256]; - uint32 receiver_len = 256; + uint8 return_state; + wifi_spi_packets_struct temp_packets; - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+GMR\r\n"); - do + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_VERSION, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_VERSION == temp_packets.head.command)) { - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - location1 = strrchr((char *)receiver_buffer, ':'); - if(wifi_spi_data_parse(wifi_spi_information.version, (uint8 *)location1, ':', '(')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - + memcpy(wifi_spi_version, temp_packets.buffer, temp_packets.head.length); + } return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 模块回显设置 -// 参数说明 model 0:关闭模块的回写功能 其他:开启模块回写 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_echo_set("1");//开启模块回写功能 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_echo_set (char *model) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI MAC地址获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,MAC地址信息以字符串形式保存在wifi_spi_mac_addr数组中 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_mac_addr (void) { - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - if('1' == *model) + uint8 return_state; + wifi_spi_packets_struct temp_packets; + + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_MAC_ADDR, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_MAC_ADDR == temp_packets.head.command)) { - wifi_spi_send_command("ATE1\r\n"); + memcpy(wifi_spi_mac_addr, temp_packets.buffer, temp_packets.head.length); + } + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI IP地址与端口号获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 +// 需要在连接Socket之后调用此函数才能正常获取信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_ip_addr_port (void) +{ + uint8 return_state; + wifi_spi_packets_struct temp_packets; + + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_IP_ADDR, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_IP_ADDR == temp_packets.head.command)) + { + memcpy(wifi_spi_ip_addr_port, temp_packets.buffer, temp_packets.head.length); + } + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 设置连接的WiFi信息并尝试连接WiFi +// 参数说明 *wifi_ssid WIFI名称 +// 参数说明 *pass_word WIFI密码 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_wifi_connect("SEEKFREE", "SEEKFREE123"); +// 备注信息 wifi_spi_wifi_connect("SEEKFREE", NULL); // 连接没有密码的WIFI热点 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_wifi_connect (char *wifi_ssid, char *pass_word) +{ + uint8 return_state; + uint8 temp_buffer[64]; + uint16 length; + + if(NULL != pass_word) + { + // WIFI热点有密码发送热点名称与密码 + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n%s\r\n", wifi_ssid, pass_word); } else { - wifi_spi_send_command("ATE0\r\n"); + // WIFI热点没有密码只需要发送热点名称 + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n", wifi_ssid); } - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + return_state = wifi_spi_set_parameter(WIFI_SPI_SET_WIFI_INFORMATION, temp_buffer, length, WIFI_CONNECT_TIME_OUT); + + // 本机IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 + wifi_spi_get_ip_addr_port(); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块自身 的 MAC 地址 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_mac()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_mac (void) -{ - uint8 return_state = 0; - uint8 receiver_buffer[64]; - uint32 receiver_len = 64; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPAPMAC?\r\n"); - do - { - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - if(wifi_spi_data_parse(wifi_spi_information.mac, receiver_buffer, '"', '"')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块或者目标WIFI 的 IP 地址(取决于模块当前的工作模式) -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_ip()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_ip (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_STATION == wifi_spi_information.mode) - { - wifi_spi_send_command("AT+CIPSTA?\r\n"); - } - else if(WIFI_SPI_SOFTAP == wifi_spi_information.mode) - { - wifi_spi_send_command("AT+CIPAP?\r\n"); - } - - do - { - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - uint8 receiver_buffer[128]; - uint32 receiver_len = 128; - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - if(wifi_spi_data_parse(wifi_spi_information.local_ip, receiver_buffer, '"', '"')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块的相关信息 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_information()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_information (void) -{ - uint8 return_state = 0; - do - { - // 获取模块版本号 - if(wifi_spi_get_version()) - { - return_state = 1; - break; - } - // 获取模块IP地址 - if(wifi_spi_get_ip()) - { - return_state = 1; - break; - } - // 获取模块MAC信息 - if(wifi_spi_get_mac()) - { - return_state = 1; - break; - } - memcpy(wifi_spi_information.local_port, "no port", 7); - }while(0); - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 连接 WiFi -// 参数说明 wifi_ssid WiFi名称 -// 参数说明 pass_word WiFi密码 -// 参数说明 model 0:查询WiFi连接情况 其他:连接WiFi -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_get_or_connect_wifi("WiFi_name", "Pass_word", 1); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_wifi (char *wifi_ssid, char *pass_word) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SOFTAP == wifi_spi_information.mode) - { - sprintf(temp, "AT+CWSAP=\"%s\",\"%s\",5,3\r\n", wifi_ssid, pass_word); - wifi_spi_send_command(temp); - } - else - { - sprintf(temp, "AT+CWJAP=\"%s\",\"%s\"\r\n", wifi_ssid, pass_word); - wifi_spi_send_command(temp); - } - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 上电是否自动连接WiFi -// 参数说明 model 0:上电不自动连接wifi 其他:上电自动连接wifi -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_auto_connect_wifi(0); //上电不自动连接wifi -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_auto_connect_wifi (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CWAUTOCONN=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置连接模式 -// 参数说明 model 0: 单连接模式 1:多连接模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_connect_model("1"); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_connect_model (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPMUX=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置传输模式 -// 参数说明 model – 0: 普通传输模式 IP断开后不重新连接 -// – 1: Wi-Fi 透传接收模式,仅支持 TCP 单连接、UDP 固定通信对端、SSL 单连接的情况 IP断开后会不断尝试重新连接 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_transfer_model("1"); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_transfer_model (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPMODE=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置模块模式 (Station/SoftAP/Station+SoftAP) -// 参数说明 state 0:无 Wi-Fi 模式,并且关闭 Wi-Fi RF----1: Station 模式----2: SoftAP 模式----3: SoftAP+Station 模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_model("1"); +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 设置连接的Socket信息并尝试连接Socket +// 参数说明 *transport_type 传输类型 +// 参数说明 *ip_addr IP地址 +// 参数说明 *port 目标端口号 +// 参数说明 *local_port 本机端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_socket_connect("TCP", "192.168.2.5", "8080", "6060"); // 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_set_model (wifi_spi_mode_enum mode) +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_socket_connect (char *transport_type, char *ip_addr, char *port, char *local_port) { - uint8 return_state = 0; + uint8 return_state; + uint8 temp_buffer[41]; + uint16 length; + + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n%s\r\n%s\r\n%s\r\n", transport_type, ip_addr, port, local_port); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + return_state = wifi_spi_set_parameter(WIFI_SPI_SET_SOCKET_INFORMATION, temp_buffer, length, SOCKET_CONNECT_TIME_OUT); - if(WIFI_SPI_SOFTAP == mode) - { - wifi_spi_send_command("AT+CWMODE=2\r\n"); - } - else - { - wifi_spi_send_command("AT+CWMODE=1\r\n"); - } - // 设置模块工作模式 - wifi_spi_information.mode = mode; - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + // 本机IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 + wifi_spi_get_ip_addr_port(); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 关闭睡眠模式 -// 参数说明 mode -// 返回参数 uint8 0:成功 1:失败 +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 断开Socket连接 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_socket_disconnect(); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_socket_disconnect (void) +{ + wifi_spi_packets_struct temp_packets; + + return wifi_spi_get_parameter(WIFI_SPI_CLOSE_SOCKET, &temp_packets, OTHER_TIME_OUT); +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 软复位 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 // 使用示例 // 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_close_sleep_model (void) +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_reset (void) { - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+SLEEP=0\r\n"); - // 设置模块工作模式 - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 断开与wifi的连接 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_disconnected_wifi(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_disconnected_wifi (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CWQAP\r\n"); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 进入打开透传模式 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_entry_serianet(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_entry_serianet (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPSEND\r\n"); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 退出透传模式 -// 参数说明 model 0:关闭透传模式 其他:开启透传模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_exit_serianet(1); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_exit_serianet (void) -{ - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - system_delay_ms(20); - wifi_spi_send_command("+++"); - system_delay_ms(1000); - - return 0; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 建立TCP连接 -// 参数说明 ip 远端 IPv4 地址、IPv6 地址,或域名 -// 参数说明 port 远端端口值 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_connect_tcp_servers("192.168.101.110", "8080"); -// 备注信息 如果总是连接不上电脑的TCP服务器 可以尝试使用网线连接电脑 -// 如果是使用WiFi连接 可能会导致模块连接TCP服务器等待较长时间 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_connect_tcp_servers (char *ip, char *port, wifi_spi_transfer_mode_enum mode) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + uint8 return_state; + wifi_spi_head_struct head; + return_state = 1; do { - if(wifi_spi_set_connect_model("0")) + head.command = WIFI_SPI_RESET; + head.length = 0xA5A5; + return_state = wifi_spi_wait_idle(OTHER_TIME_OUT); + if(return_state) { - return_state = 1; break; } + wifi_spi_write(&head.command, sizeof(wifi_spi_head_struct), NULL, 0); + }while(0); + + return return_state; +} - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPSTARTEX=\"TCP\",\"%s\",%s\r\n", ip, port); - wifi_spi_send_command(temp); - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI UDP模式时立即发送函数 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 在UDP模式下模块收到数据后会等待2毫秒,2毫秒后未收到数据则将数据通过socket发送到网络,如果希望立即发送则在数据传输完毕后调用此函数 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_udp_send_now (void) +{ + uint8 return_state = 1; + wifi_spi_packets_struct temp_packets; + + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + do { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - // 设置传输模式 - if(wifi_spi_set_transfer_model(WIFI_SPI_COMMAND == mode ? "0" : "1")) - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPSTATE?\r\n"); - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - else - { - uint8 receiver_buffer[128]; - uint32 receiver_len = 128; - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - char* buffer_index = (char *)receiver_buffer; - char* end_index; - - buffer_index += 22; - buffer_index += strlen(ip); - buffer_index += strlen(port); - end_index = strchr(buffer_index, ','); - - memcpy(wifi_spi_information.local_port, " ", 7); - memcpy(wifi_spi_information.local_port, buffer_index, (end_index - buffer_index)); - } - - wifi_spi_information.connect_state = WIFI_SPI_SERVER_ON; - wifi_spi_information.connect_mode = WIFI_SPI_TCP_CLIENT; - wifi_spi_information.transfer_mode = mode; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SERIANET == mode) // 透传模式下直接开启透传 - { - if(wifi_spi_entry_serianet()) + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) { - return_state = 1; break; } - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 建立UDP连接 -// 参数说明 *ip 远端 IPv4 地址、IPv6 地址 或域名 字符串形式 -// 参数说明 *port 远端端口值 字符串形式 -// 参数说明 *local_port 远端 IPv4 地址、IPv6 地址 或域名 字符串形式 -// 参数说明 mode 模块数据通信模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_connect_udp_client("192.168.101.110", "8080", "8080", WIFI_SPI_COMMAND); -// 备注信息 自动分配ID -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_connect_udp_client (char *ip, char *port, char *local_port, wifi_spi_transfer_mode_enum mode) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - do - { - if(wifi_spi_set_connect_model("0")) - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + // 立即开始socket发送 + temp_packets.head.command = WIFI_SPI_UDP_SEND; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + + // 等待应答信号 + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + + // 接收应答信号 + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, temp_packets.head.length); + + if(WIFI_SPI_REPLY_OK == temp_packets.head.command) + { + return_state = 0; + } + + }while(0); - sprintf(temp, "AT+CIPSTARTEX=\"UDP\",\"%s\",%s,%s\r\n", ip, port, local_port); - wifi_spi_send_command(temp); + // 将通讯状态设置为空闲 + wifi_spi_mutex = WIFI_SPI_IDLE; + } + + return return_state; +} - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 数据块发送函数并同步接收数据 +// 参数说明 *buff 需要发送的数据地址 +// 参数说明 length 发送长度 +// 返回参数 uint32 剩余未发送的长度 +// 使用示例 wifi_spi_send_buffer(buffer, 100); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +uint32 wifi_spi_send_buffer (const uint8 *buffer, uint32 length) +{ + uint16 send_length; + wifi_spi_packets_struct temp_packets; + + // 检查WIFI SPI状态,如果在其他中断或者线程中已经发起了通讯,则本次不能发送数据 + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + + while(length) { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_spi_set_transfer_model(WIFI_SPI_COMMAND == mode ? "0" : "1")) // 设置传输模式 - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SERIANET == mode) // 透传模式下直接开启透传 - { - if(wifi_spi_entry_serianet()) + send_length = length > WIFI_SPI_TRANSFER_SIZE ? (uint16)WIFI_SPI_TRANSFER_SIZE : (uint16)length; + + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) { - return_state = 1; break; } - } - memcpy(wifi_spi_information.local_port, " ", 7); - memcpy(wifi_spi_information.local_port, local_port, strlen(local_port)); - wifi_spi_information.connect_state = WIFI_SPI_SERVER_ON; - wifi_spi_information.connect_mode = WIFI_SPI_UDP_CLIENT; - wifi_spi_information.transfer_mode = mode; - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 断开连接 TCP Server 使用本接口将会断开所有连接 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_disconnect_link(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_disconnect_link (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - do - { - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - wifi_spi_send_command("AT+CIPCLOSE=5\r\n"); - } - else - { - wifi_spi_send_command("AT+CIPCLOSE\r\n"); - } - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送字节函数 -// 参数说明 data 需要发送的数据 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_byte(0xa5); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_byte (uint8 data) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - send_length = 1; - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data(&data, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else - { - send_length = (uint16)wifi_spi_write_data(&data, send_length); - } - } - } - - return send_length; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送缓冲区函数 -// 参数说明 buff 需要发送的数据地址 -// 参数说明 len 发送长度 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_buffer("123", 3); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 len) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - while(len) - { - if((WIFI_SPI_WRITE_MAX * 2) < len) send_length = WIFI_SPI_WRITE_MAX * 2; - else - { - send_length = (uint16)len; - } - len -= send_length; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data(buff, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } - buff += send_length; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else - { - len = wifi_spi_write_data(buff, len); - } - } - } - - return len; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送缓冲区函数(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 -// 备注信息 需要发送多个数组时,采用此函数可以极大的降低通讯时间,发送数据总长度不能超过4092 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_buffer_multi (wifi_spi_send_multi_struct *multi_buffer) -{ - uint8 i; - uint16 remain_length; - - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - for(i = 0; i < WIFI_SPI_MAX_MULTI; i++) - { - if(multi_buffer->source[i]) wifi_spi_send_buffer(multi_buffer->source[i], multi_buffer->length[i]); - } - } - else - { - remain_length = (uint16)wifi_spi_write_data_multi(multi_buffer); - } - } - } - - return remain_length; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送字符串函数 -// 参数说明 *str 需要发送的数据 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_string("123"); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_string (const char *str) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - send_length = (uint16)strlen(str); - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data((uint8 *)str, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } + wifi_spi_transfer_data(buffer, &temp_packets, send_length); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) { - send_length = (uint16)wifi_spi_write_data((uint8 *)str, send_length); + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + + length -= send_length; + buffer += send_length; + } + + // 检查最后一次的接收是否将所有的数据都接收完毕 + while(WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) + { + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + + // 继续读取模块剩余数据 + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } } } + wifi_spi_mutex = WIFI_SPI_IDLE; } - - return send_length; + return length; } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi 模块数据接收函数 -// 参数说明 buffer 接收数据的存放地址 -// 参数说明 len 数组长度,可直接填写或者使用sizeof求得 -// 返回参数 uint32 返回实际接收到的数据长度 -// 使用示例 uint8 test_buffer[256]; wifi_spi_read_buffer(&test_buffer[0], sizeof(test_buffer)); +// 函数简介 WIFI SPI 读取缓冲区 +// 参数说明 *buff 接收缓冲区 +// 参数说明 length 读取数据长度 +// 返回参数 uint32 实际读取数据长度 +// 使用示例 wifi_spi_read_buffer(buffer, 100); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 len) +uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 length) { - fifo_read_buffer(&wifi_spi_fifo, buffer, &len, FIFO_READ_AND_CLEAN); - return len; + zf_assert(NULL != buffer); + uint32 data_len = length; + +#if(1 == WIFI_SPI_READ_TRANSFER) + + wifi_spi_packets_struct temp_packets; + // 检查WIFI SPI状态,如果在其他中断或者线程中已经发起了通讯,则本次不能发送数据 + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + + // 发起通讯查看模块内是否有数据未读取 + do + { + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + }while(WIFI_SPI_REPLY_DATA_START == temp_packets.head.command); + wifi_spi_mutex = WIFI_SPI_IDLE; + } +#endif + + fifo_read_buffer(&wifi_spi_fifo, buffer, &data_len, FIFO_READ_AND_CLEAN); + return data_len; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 wifi spi handshake中断回调函数 -// 参数说明 void -// 返回参数 void -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -void wifi_spi_callback (void) -{ - wifi_spi_check_state_read_buffer(); - wifi_spi_ack_flag = 1; // ACK标志位置1 -} - - //------------------------------------------------------------------------------------------------------------------- // 函数简介 WiFi 模块初始化 // 参数说明 *wifi_ssid 目标连接的 WiFi 的名称 字符串形式 // 参数说明 *pass_word 目标连接的 WiFi 的密码 字符串形式 -// 参数说明 wifi_mode 模块的工作模式 参照 zf_device_wireless_spi.h 中 wifi_spi_mode_enum 枚举 // 返回参数 uint8 模块初始化状态 0-成功 1-错误 -// 使用示例 wifi_spi_init("SEEKFREE_2.4G", "SEEKFREEV2", WIFI_UART_STATION); -// 备注信息 初始化会首先设置串口配置,之后会对模块进行基本参数配置 -// 具体的配置信息可以在 zf_device_wireless_spi.h 文件中修改 +// 使用示例 wifi_spi_init("SEEKFREE", "SEEKFREE123"); +// 备注信息 wifi_spi_init("SEEKFREE", NULL); // 连接没有密码的WIFI热点 //------------------------------------------------------------------------------------------------------------------- -uint8 wifi_spi_init (char *wifi_ssid, char *pass_word, wifi_spi_mode_enum wifi_mode) +uint8 wifi_spi_init (char *wifi_ssid, char *pass_word) { uint8 return_state = 0; - uint32 temp_isr; - - spi_init(WIFI_SPI_INDEX, SPI_MODE0, WIFI_SPI_SPEED, WIFI_SPI_SCK_PIN, WIFI_SPI_MOSI_PIN, WIFI_SPI_MISO_PIN, SPI_CS_NULL);//硬件SPI初始化 - set_wireless_type(WIFI_SPI, wifi_spi_callback); - fifo_init(&wifi_spi_fifo, FIFO_DATA_8BIT, wifi_spi_buffer, WIFI_SPI_BUFFER_SIZE); + fifo_init(&wifi_spi_fifo, FIFO_DATA_8BIT, wifi_spi_buffer, WIFI_SPI_RECVIVE_FIFO_SIZE); + spi_init(WIFI_SPI_INDEX, SPI_MODE3, WIFI_SPI_SPEED, WIFI_SPI_SCK_PIN, WIFI_SPI_MOSI_PIN, WIFI_SPI_MISO_PIN, SPI_CS_NULL);//硬件SPI初始化 gpio_init(WIFI_SPI_CS_PIN, GPO, 1, GPO_PUSH_PULL); gpio_init(WIFI_SPI_RST_PIN, GPO, 1, GPO_PUSH_PULL); - - temp_isr = interrupt_global_disable(); - - exti_init(WIFI_SPI_INT_PIN, EXTI_TRIGGER_RISING); - + gpio_init(WIFI_SPI_INT_PIN, GPI, 0, GPI_PULL_DOWN); + + // 复位 gpio_set_level(WIFI_SPI_RST_PIN, 0); - system_delay_ms(50); + system_delay_ms(10); gpio_set_level(WIFI_SPI_RST_PIN, 1); - system_delay_ms(1000); + + // 等待模块初始化 + system_delay_ms(100); + wifi_spi_mutex = WIFI_SPI_IDLE; - exti_flag_clear(WIFI_SPI_INT_PIN); - - interrupt_global_enable(temp_isr); do { - if(wifi_spi_echo_set("0")) // 关闭模块回写 + // 固件版本信息以字符串形式保存在wifi_spi_version数组中 + return_state = wifi_spi_get_version(); + if(return_state) + { + break; + } + + // MAC地址信息以字符串形式保存在wifi_spi_mac_addr数组中 + wifi_spi_get_mac_addr(); + + + return_state = wifi_spi_wifi_connect(wifi_ssid, pass_word); + if(return_state) { - zf_log(0, "exit echo failed"); - return_state = 1; break; } - if(wifi_spi_auto_connect_wifi("0")) // 关闭自动连接 + #if(1 == WIFI_SPI_AUTO_CONNECT) + return_state = wifi_spi_socket_connect("TCP", WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT); + if(return_state) { - zf_log(0, "close auto connect failed"); - return_state = 1; break; } - - if(wifi_spi_set_model(wifi_mode)) // 设置运行模式 + #endif + + #if(2 == WIFI_SPI_AUTO_CONNECT) + return_state = wifi_spi_socket_connect("UDP", WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT); + if(return_state) { - zf_log(0, "set run mode failed"); - return_state = 1; break; } - - if(wifi_spi_close_sleep_model()) // 关闭睡眠模式 - { - zf_log(0, "set sleep mode failed"); - return_state = 1; - break; - } - - if(wifi_spi_set_wifi((char *)wifi_ssid, (char *)pass_word)) // 连接 wifi 或者开启热点 - { - zf_log(0, "wifi set failed"); - return_state = 1; - break; - } - - if(wifi_spi_get_information()) // 模块基本参数获取 - { - zf_log(0, "get module information failed"); - return_state = 1; - break; - } -#if WIFI_SPI_AUTO_CONNECT == 1 - if(wifi_spi_connect_tcp_servers(WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_SERIANET)) // 连接TCP服务器 - { - zf_log(0, "connect TCP server failed"); - return_state = 1; - break; - } -#endif -#if WIFI_SPI_AUTO_CONNECT == 2 - if(wifi_spi_connect_udp_client(WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT, WIFI_SPI_SERIANET)) // 建立UDP连接 - { - zf_log(0, "connect UDP server failed"); - return_state = 1; - break; - } -#endif - // 模块初始化成功 - wifi_spi_init_flag = 1; + #endif }while(0); - + return return_state; } diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_wifi_spi.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_wifi_spi.h index 5e5a025..24e7eb1 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_wifi_spi.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_wifi_spi.h @@ -24,13 +24,13 @@ * 文件名称 zf_device_wifi_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 * 日期 作者 备注 -* 2023-05-27 pudding first version +* 2024-01-18 SeekFree first version ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,128 +53,100 @@ #include "zf_common_typedef.h" + #define WIFI_SPI_INDEX (SPI_3 ) // 定义使用的SPI号 -#define WIFI_SPI_SPEED (30 * 1000 * 1000 ) // 硬件 SPI 速率 +#define WIFI_SPI_SPEED (50 * 1000 * 1000 ) // 硬件 SPI 速率 #define WIFI_SPI_SCK_PIN (SPI3_SCLK_P22_3 ) // 定义SPI_SCK引脚 #define WIFI_SPI_MOSI_PIN (SPI3_MOSI_P22_0 ) // 定义SPI_MOSI引脚 #define WIFI_SPI_MISO_PIN (SPI3_MISO_P22_1 ) // 定义SPI_MISO引脚 IPS没有MISO引脚,但是这里任然需要定义,在spi的初始化时需要使用 #define WIFI_SPI_CS_PIN (P22_2 ) // 定义SPI_CS引脚 采用软件CS引脚 -#define WIFI_SPI_INT_PIN (ERU_CH5_REQ1_P15_8) // 定义中断引脚 +#define WIFI_SPI_INT_PIN (P15_8 ) // 定义握手引脚 #define WIFI_SPI_RST_PIN (P23_1 ) // 定义复位引脚 - - -#define WIFI_SPI_BUFFER_SIZE (1024) // 定义SPI接收的缓冲区大小 -#define WIFI_SPI_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不连接 1-自动连接TCP服务器并进入透传模式 2-自动连接UDP服务器并进入透传模式 3:自动建立TCP服务器 - -#if (WIFI_SPI_AUTO_CONNECT > 2) + +#define WIFI_SPI_RECVIVE_FIFO_SIZE (1024) // 接收FIFO大小 +#define WIFI_SPI_READ_TRANSFER (1) // 在调用wifi_spi_read_buffer 是否尝试发起SPI通讯来检测模块内是否有数据需要读取 1:发起SPI通讯 0:不发起SPI通讯,仅读取FIFO + // 如果应用程序中没有任何的地方调用发送函数,则WIFI_SPI_READ_TRANSFER必须设置为1 + +#define WIFI_SPI_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不自动连接 1-自动连接TCP服务器 2-自动连接UDP + +#if (WIFI_SPI_AUTO_CONNECT > 2) #error "WIFI_SPI_AUTO_CONNECT 的值只能为 [0,1,2]" #else -#define WIFI_SPI_TARGET_IP "192.168.2.28" // 连接目标的 IP +#define WIFI_SPI_TARGET_IP "192.168.137.1" // 连接目标的 IP #define WIFI_SPI_TARGET_PORT "8080" // 连接目标的端口 -#define WIFI_SPI_LOCAL_PORT "8080" // 本机端口 +#define WIFI_SPI_LOCAL_PORT "6666" // 本机的端口 0:随机 可设置范围2048-65535 默认 6666 #endif -#define WIFI_SPI_MAX_MULTI (17) // 多地址发送,最大8个地址 -typedef enum -{ - BUFFER_IDLE, // 模块的缓冲区是空闲的 - BUFFER_READ, // 模块的缓冲区有数据需要读取 - BUFFER_WRITE, // 模块的缓冲区是可写的 -}wifi_spi_buffer_state_enum; +#define WIFI_SPI_RECVIVE_SIZE (32) // 每次SPI传输接收的字节数 不允许修改 +#define WIFI_SPI_TRANSFER_SIZE (4088) // 最大SPI传输接收的字节数 不允许修改 + + typedef enum -{ - TRANSMIT_IDLE, // 当前没有传输 - TRANSMIT_WRITE_REQUEST, // 给模块发送了一个传输请求 - TRANSMIT_READ_STATE, // 读取模块状态 - TRANSMIT_READ, // 正在读取模块内部数据 - TRANSMIT_WRITE, // 正在往模块写入数据 -}wifi_spi_transmit_state_enum; - -typedef enum -{ - WIFI_SPI_STATION, // 设备模式 - WIFI_SPI_SOFTAP, // AP模式 -}wifi_spi_mode_enum; - -typedef enum -{ - WIFI_SPI_COMMAND, // 使用命令的方式发送数据 - WIFI_SPI_SERIANET, // 使用透传的方式发送数据 -}wifi_spi_transfer_mode_enum; - -typedef enum -{ - WIFI_SPI_TCP_CLIENT, // 模块连接TCP服务器 - WIFI_SPI_TCP_SERVER, // 模块作为TCP服务器 - WIFI_SPI_UDP_CLIENT, // 模块启用UDP连接 -}wifi_spi_connect_mode_enum; - -typedef enum -{ - WIFI_SPI_SERVER_OFF, // 模块未连接服务器 - WIFI_SPI_SERVER_ON, // 模块已经连接服务器 -}wifi_spi_connect_state_enum; - -typedef enum -{ - WIFI_SPI_LINK_0, // 模块当前链接 0 - WIFI_SPI_LINK_1, // 模块当前链接 1 - WIFI_SPI_LINK_2, // 模块当前链接 2 - WIFI_SPI_LINK_3, // 模块当前链接 3 - WIFI_SPI_LINK_4, // 模块当前链接 4 -}wifi_spi_link_id_enum; - -typedef struct { - uint8 reserve; - uint8 cmd; - uint8 addr; - uint8 dummy; - uint8 magic; - uint8 sequence; - uint16 length; -}wifi_spi_buffer_struct; + // 主机发送的命令 + WIFI_SPI_INVALID1 = 0x00, // 无效数据包 + WIFI_SPI_RESET = 0x01, // 复位命令 + WIFI_SPI_DATA = 0x02, // 透传数据包 + WIFI_SPI_UDP_SEND = 0x03, // UDP下立即发送命令,默认SPI接收数据后2MS未收到数据自动发送数据 + WIFI_SPI_CLOSE_SOCKET = 0x04, // 断开连接 + + WIFI_SPI_SET_WIFI_INFORMATION = 0x10, // 设置WIFI信息命令 + WIFI_SPI_SET_SOCKET_INFORMATION = 0x11, // 设置SOCKET信息命令 + + WIFI_SPI_GET_VERSION = 0x20, // 获取模块版本 + WIFI_SPI_GET_MAC_ADDR = 0x21, // 获取模块MAC地址 + WIFI_SPI_GET_IP_ADDR = 0x22, // 获取模块IP地址 + + // 从机回传的命令 + WIFI_SPI_REPLY_OK = 0x80, // 从机应答的正确命令 + WIFI_SPI_REPLY_ERROR = 0x81, // 从机应答的错误命令 + + WIFI_SPI_REPLY_DATA_START = 0x90, // 从机回传的数据包,并且还有数据需要主机读取 + WIFI_SPI_REPLY_DATA_END = 0x91, // 从机回传的数据包,数据已读取完毕 + + WIFI_SPI_REPLY_VERSION = 0xA0, // 从机回复固件版本 + WIFI_SPI_REPLY_MAC_ADDR = 0xA1, // 从机回复本机MAC地址等信息 + WIFI_SPI_REPLY_IP_ADDR = 0xA2, // 从机回复本机IP地址、端口号 + WIFI_SPI_INVALID2 = 0xFF // 无效数据包 +}wifi_spi_packets_command_enum; + +typedef enum +{ + WIFI_SPI_IDLE, // 模块空闲,可以进行SPI通讯 + WIFI_SPI_BUSY, // 模块正忙,不可进行SPI通讯 +}wifi_spi_state_enum; + + +typedef struct +{ + uint8 command; // 命令字 + uint8 reserve; // 保留 + uint16 length; // 包有效长度 +}wifi_spi_head_struct; + + +typedef struct +{ + wifi_spi_head_struct head; // 帧头 + uint8 buffer[WIFI_SPI_RECVIVE_SIZE]; // 缓冲区 +}wifi_spi_packets_struct; + + +extern char wifi_spi_version[12]; // 固件版本 字符串 +extern char wifi_spi_mac_addr[20]; // 模块MAC地址 字符串 +extern char wifi_spi_ip_addr_port[25]; // IP地址与端口号 字符串 -typedef struct -{ - uint8 version[12]; // 固件版本 字符串形式 - uint8 mac[20]; // 本机 MAC 地址 字符串形式 - uint8 local_ip[17]; // 本机 IP 地址 字符串形式 - uint8 local_port[10]; // 本机端口号 字符串形式 - uint8 remote_ip[5][17]; // 远端 IP 地址 字符串形式 - wifi_spi_mode_enum mode; // WIFI 模式 - wifi_spi_transfer_mode_enum transfer_mode; // 当前传输模式 - wifi_spi_connect_mode_enum connect_mode; // 网络连接模式 - wifi_spi_connect_state_enum connect_state; // 服务器连接情况 -}wifi_spi_information_struct; +uint8 wifi_spi_wifi_connect (char *wifi_ssid, char *pass_word); +uint8 wifi_spi_socket_connect (char *transport_type, char *ip_addr, char *port, char *local_port); +uint8 wifi_spi_socket_disconnect (void); +uint8 wifi_spi_udp_send_now (void); +uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 length); +uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 length); -typedef struct -{ - uint8 *source[WIFI_SPI_MAX_MULTI]; - uint16 length[WIFI_SPI_MAX_MULTI]; -}wifi_spi_send_multi_struct; - -extern wifi_spi_information_struct wifi_spi_information; - - -uint8 wifi_spi_disconnected_wifi (void); // 断开 WIFI 连接 -uint8 wifi_spi_entry_serianet (void); // 打开透传模式 -uint8 wifi_spi_exit_serianet (void); // 关闭透传模式 - -uint8 wifi_spi_connect_tcp_servers (char *ip, char *port, wifi_spi_transfer_mode_enum mode); // 建立 TCP 连接 -uint8 wifi_spi_connect_udp_client (char *ip, char *port, char *local_port, wifi_spi_transfer_mode_enum mode); // 建立 UDP 传输 -uint8 wifi_spi_disconnect_link (void); // 断开连接 TCP Server 使用本接口将会断开所有连接 - -uint32 wifi_spi_send_byte (uint8 data); // WIFI 模块发送字节函数 -uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 length); // WIFI 模块发送缓冲区函数 -uint32 wifi_spi_send_buffer_multi (wifi_spi_send_multi_struct *multi_buffer); // WIFI 模块发送多缓冲区函数 -uint32 wifi_spi_send_string (const char *str); // WIFI 模块发送字符串函数 - -uint32 wifi_spi_read_buffer (uint8 *buff, uint32 len); // WIFI 模块数据接收函数 - -uint8 wifi_spi_init (char *wifi_ssid, char *pass_word, wifi_spi_mode_enum wifi_mode); // WIFI 模块初始化函数 +uint8 wifi_spi_init (char *wifi_ssid, char *pass_word); #endif + diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_wifi_uart.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_wifi_uart.c index 312dab7..ff728bb 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_wifi_uart.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_wifi_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_wifi_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -61,7 +61,7 @@ wifi_uart_information_struct wifi_uart_information; // 模块自身参数 -static fifo_obj_struct wifi_uart_fifo; +static fifo_struct wifi_uart_fifo; static uint8 wifi_uart_buffer[WIFI_UART_BUFFER_SIZE]; // 数据存放数组 static uint8 wifi_uart_data; diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_wifi_uart.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_wifi_uart.h index abcb253..3316b6f 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_wifi_uart.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_wifi_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_wifi_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_wireless_uart.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_wireless_uart.c index eac2867..91ec013 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_wireless_uart.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_wireless_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_wireless_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -53,7 +53,7 @@ #include "zf_device_type.h" #include "zf_device_wireless_uart.h" -static fifo_obj_struct wireless_uart_fifo; +static fifo_struct wireless_uart_fifo; static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; static uint8 wireless_uart_data = 0; diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_wireless_uart.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_wireless_uart.h index 2418545..a789ad0 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_wireless_uart.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_wireless_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_wireless_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -61,11 +61,11 @@ // 注意事项2:开启自动波特率务必连接RTS引脚 否则会开启失败。 // 注意事项3:模块自动波特率失败的话 可以尝试断电重启 -// 开启自动波特率务必阅读上面两条 注意事项 -// 开启自动波特率务必阅读上面两条 注意事项 -// 开启自动波特率务必阅读上面两条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 -// 0:关闭自动波特率 +// 0:关闭自动波特率 // 1:开启自动波特率 自动波特率的作用是修改 WIRELESS_UART_BAUD 之后不需要对模块进行配置 模块会自动设置为对应的波特率 #define WIRELESS_UART_AUTO_BAUD_RATE ( 1 ) diff --git a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_adc.c b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_adc.c index 9a262a1..06694d8 100644 --- a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_adc.c +++ b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_adc.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_adc * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_adc.h b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_adc.h index 378b67e..f017c76 100644 --- a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_adc.h +++ b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_adc.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_adc * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_delay.c b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_delay.c index 4ec533c..ae3e610 100644 --- a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_delay.c +++ b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_delay.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_delay * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_delay.h b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_delay.h index e8d82ef..7b8b475 100644 --- a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_delay.h +++ b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_delay.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_delay * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_dma.c b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_dma.c index f72f1d6..43bffbc 100644 --- a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_dma.c +++ b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_dma.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_dma * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_dma.h b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_dma.h index 1ec555b..320d40c 100644 --- a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_dma.h +++ b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_dma.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_dma * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_encoder.c b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_encoder.c index 6592198..0e0e0b9 100644 --- a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_encoder.c +++ b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_encoder.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_encoder.h b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_encoder.h index 68d159f..e079122 100644 --- a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_encoder.h +++ b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_encoder.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_exti.c b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_exti.c index 72c9a1f..31d270a 100644 --- a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_exti.c +++ b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_exti.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_exti * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_exti.h b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_exti.h index 30f5ef6..b63f9ee 100644 --- a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_exti.h +++ b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_exti.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_exti * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_flash.c b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_flash.c index f91f5a0..325cfed 100644 --- a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_flash.c +++ b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_flash.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_flash * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_flash.h b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_flash.h index 912585a..e7425fd 100644 --- a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_flash.h +++ b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_flash.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_flash * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_gpio.c b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_gpio.c index 5071114..a084353 100644 --- a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_gpio.c +++ b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_gpio.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_gpio * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_gpio.h b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_gpio.h index 2b23be0..550fb8d 100644 --- a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_gpio.h +++ b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_gpio.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_gpio * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_pit.c b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_pit.c index c4dc50d..5e03d38 100644 --- a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_pit.c +++ b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_pit.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pit * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_pit.h b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_pit.h index 5461e05..66854b5 100644 --- a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_pit.h +++ b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_pit.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pit * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_pwm.c b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_pwm.c index ad1059a..24d8d7a 100644 --- a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_pwm.c +++ b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_pwm.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pwm * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_pwm.h b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_pwm.h index d6dce78..51948a4 100644 --- a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_pwm.h +++ b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_pwm.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pwm * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_soft_iic.c b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_soft_iic.c index 9833b62..a349ec7 100644 --- a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_soft_iic.c +++ b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_soft_iic.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_iic * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_soft_iic.h b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_soft_iic.h index a62b262..80db53b 100644 --- a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_soft_iic.h +++ b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_soft_iic.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_iic * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_soft_spi.c b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_soft_spi.c index 292c60b..954fbe3 100644 --- a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_soft_spi.c +++ b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_soft_spi.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_soft_spi.h b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_soft_spi.h index 6a9c207..62858de 100644 --- a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_soft_spi.h +++ b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_soft_spi.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_spi.c b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_spi.c index 1b99196..f817dd9 100644 --- a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_spi.c +++ b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_spi.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -920,7 +920,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 do { - IfxQspi_writeTransmitFifo(moudle, (uint8)(*write_buffer & 0xFF00) >> 8); // 将发送的数据写入缓冲区 + IfxQspi_writeTransmitFifo(moudle, (uint8)((*write_buffer & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 if(read_buffer != NULL) { diff --git a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_spi.h b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_spi.h index e73507e..d15589c 100644 --- a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_spi.h +++ b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_spi.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_timer.c b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_timer.c index a953b92..e085d6e 100644 --- a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_timer.c +++ b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_timer.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_timer * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_timer.h b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_timer.h index 3c86f58..1bb348f 100644 --- a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_timer.h +++ b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_timer.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_timer * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_uart.c b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_uart.c index cd19782..fb89b55 100644 --- a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_uart.c +++ b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_uart.h b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_uart.h index 8d1d111..cdc55ab 100644 --- a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_uart.h +++ b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E13_dual_core_demo/user/isr.c b/Example/E13_dual_core_demo/user/isr.c index 27171d2..9108ff0 100644 --- a/Example/E13_dual_core_demo/user/isr.c +++ b/Example/E13_dual_core_demo/user/isr.c @@ -24,7 +24,7 @@ * 文件名称 isr * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -118,7 +118,7 @@ IFX_INTERRUPT(exti_ch1_ch5_isr, 0, EXTI_CH1_CH5_INT_PRIO) { exti_flag_clear(ERU_CH5_REQ1_P15_8); - wireless_module_spi_handler(); // SPI WIFI 中断回调函数 + } } diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/doc/version.txt b/Example/E14_specifies_variable_or_code_location_demo/libraries/doc/version.txt index b841b50..d644136 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/doc/version.txt +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/doc/version.txt @@ -1,3 +1,8 @@ +V3.2.6 + 更新逐飞助手接口函数 调用初始化时直接传参通信类 + 更新wifi SPI驱动文件 提高通信效率 + 更新GPS驱动文件,更名为GNSS,兼容普通定位模块及RTK + V3.2.5 修复延时函数初始化参数及中断向量表问题 V3.2.4 diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h index 28ff689..371e6b6 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/infineon_libraries/Configurations/Ifx_Cfg.h @@ -34,7 +34,7 @@ /*------------------------------------------Configuration for IfxScu_cfg.h-------------------------------------------*/ /*********************************************************************************************************************/ /* External oscillator frequency in Hz */ -#define IFX_CFG_SCU_XTAL_FREQUENCY (20000000) /* Allowed values are: 16000000, 20000000 or 40000000 */ +#define IFX_CFG_SCU_XTAL_FREQUENCY (20000000) /* Allowed values are9p: 16000000, 20000000 or 40000000 */ /* PLL frequency in Hz */ #define IFX_CFG_SCU_PLL_FREQUENCY (200000000) /* Allowed values are: 80000000, 133000000, 160000000 * or 200000000 */ diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_clock.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_clock.c index 5023270..9872ea9 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_clock.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_clock.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_clock * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_clock.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_clock.h index 9face65..2b50396 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_clock.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_clock.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_clock * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_debug.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_debug.c index 52c623d..d680265 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_debug.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_debug.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_debug * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -46,7 +46,7 @@ static volatile uint8 zf_debug_assert_enable = 1; #if DEBUG_UART_USE_INTERRUPT // 如果启用 debug uart 接收中断 uint8 debug_uart_buffer[DEBUG_RING_BUFFER_LEN]; // 数据存放数组 uint8 debug_uart_data; -fifo_obj_struct debug_uart_fifo; +fifo_struct debug_uart_fifo; #endif //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_debug.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_debug.h index 881a297..4fb4d91 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_debug.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_debug.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_debug * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_fifo.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_fifo.c index b010d3e..94f5133 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_fifo.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_fifo.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_fifo * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -45,7 +45,7 @@ // 使用示例 fifo_head_offset(fifo, 1); // 备注信息 本函数在文件内部调用 用户不用关注 也不可修改 //------------------------------------------------------------------------------------------------------------------- -static void fifo_head_offset (fifo_obj_struct *fifo, uint32 offset) +static void fifo_head_offset (fifo_struct *fifo, uint32 offset) { fifo->head += offset; @@ -63,7 +63,7 @@ static void fifo_head_offset (fifo_obj_struct *fifo, uint32 offset) // 使用示例 fifo_end_offset(fifo, 1); // 备注信息 本函数在文件内部调用 用户不用关注 也不可修改 //------------------------------------------------------------------------------------------------------------------- -static void fifo_end_offset (fifo_obj_struct *fifo, uint32 offset) +static void fifo_end_offset (fifo_struct *fifo, uint32 offset) { fifo->end += offset; @@ -80,7 +80,7 @@ static void fifo_end_offset (fifo_obj_struct *fifo, uint32 offset) // 使用示例 fifo_clear(fifo); // 备注信息 清空当前 FIFO 对象的内存 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_clear (fifo_obj_struct *fifo) +fifo_state_enum fifo_clear (fifo_struct *fifo) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -113,7 +113,7 @@ fifo_state_enum fifo_clear (fifo_obj_struct *fifo) // 使用示例 uint32 len = fifo_used(fifo); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 fifo_used (fifo_obj_struct *fifo) +uint32 fifo_used (fifo_struct *fifo) { zf_assert(fifo != NULL); return (fifo->max - fifo->size); // 返回当前 FIFO 缓冲区中数据个数 @@ -127,7 +127,7 @@ uint32 fifo_used (fifo_obj_struct *fifo) // 使用示例 zf_log(fifo_write_element(&fifo, data) == FIFO_SUCCESS, "fifo_write_byte error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat) +fifo_state_enum fifo_write_element (fifo_struct *fifo, uint32 dat) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -171,7 +171,7 @@ fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat) // 使用示例 zf_log(fifo_write_buffer(&fifo, data, 32) == FIFO_SUCCESS, "fifo_write_buffer error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 length) +fifo_state_enum fifo_write_buffer (fifo_struct *fifo, void *dat, uint32 length) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -286,7 +286,7 @@ fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 leng // 使用示例 zf_log(fifo_read_element(&fifo, data, FIFO_READ_ONLY) == FIFO_SUCCESS, "fifo_read_byte error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operation_enum flag) +fifo_state_enum fifo_read_element (fifo_struct *fifo, void *dat, fifo_operation_enum flag) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; // 操作结果初值 @@ -348,7 +348,7 @@ fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operat // 使用示例 zf_log(fifo_read_buffer(&fifo, data, &length, FIFO_READ_ONLY) == FIFO_SUCCESS, "fifo_read_buffer error"); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) +fifo_state_enum fifo_read_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) { zf_assert(NULL != fifo); zf_assert(NULL != length); @@ -447,7 +447,7 @@ fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *leng // 如果使用 FIFO_READ_AND_CLEAN 操作 将会丢弃所有数据并清空整个 FIFO // 如果使用 FIFO_READ_AND_CLEAN 操作 将会丢弃所有数据并清空整个 FIFO //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) +fifo_state_enum fifo_read_tail_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag) { zf_assert(NULL != fifo); zf_assert(NULL != length); @@ -541,7 +541,7 @@ fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 // 使用示例 fifo_init(&user_fifo, user_buffer, 64); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -fifo_state_enum fifo_init (fifo_obj_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size) +fifo_state_enum fifo_init (fifo_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size) { zf_assert(NULL != fifo); fifo_state_enum return_state = FIFO_SUCCESS; diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_fifo.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_fifo.h index 5cc7668..901a913 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_fifo.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_fifo.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_fifo * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -91,17 +91,17 @@ typedef struct uint32 end; // 缓存尾指针 总是指向非空缓存(缓存全空除外) uint32 size; // 缓存剩余大小 uint32 max; // 缓存总大小 -}fifo_obj_struct; +}fifo_struct; -fifo_state_enum fifo_clear (fifo_obj_struct *fifo); -uint32 fifo_used (fifo_obj_struct *fifo); +fifo_state_enum fifo_clear (fifo_struct *fifo); +uint32 fifo_used (fifo_struct *fifo); -fifo_state_enum fifo_write_element (fifo_obj_struct *fifo, uint32 dat); -fifo_state_enum fifo_write_buffer (fifo_obj_struct *fifo, void *dat, uint32 length); -fifo_state_enum fifo_read_element (fifo_obj_struct *fifo, void *dat, fifo_operation_enum flag); -fifo_state_enum fifo_read_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); -fifo_state_enum fifo_read_tail_buffer (fifo_obj_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); +fifo_state_enum fifo_write_element (fifo_struct *fifo, uint32 dat); +fifo_state_enum fifo_write_buffer (fifo_struct *fifo, void *dat, uint32 length); +fifo_state_enum fifo_read_element (fifo_struct *fifo, void *dat, fifo_operation_enum flag); +fifo_state_enum fifo_read_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); +fifo_state_enum fifo_read_tail_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag); -fifo_state_enum fifo_init (fifo_obj_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size); +fifo_state_enum fifo_init (fifo_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size); #endif diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_font.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_font.c index c816f9d..ee1df09 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_font.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_font.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_font * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_font.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_font.h index 24b8602..7531250 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_font.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_font.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_font * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_function.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_function.c index d403fb5..acf2739 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_function.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_function.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_function * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_function.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_function.h index f5683e1..101b58a 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_function.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_function.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_function * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_headfile.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_headfile.h index aa06ef8..86762db 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_headfile.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_headfile.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_headfile * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -82,7 +82,7 @@ //===================================================外接设备驱动层=================================================== #include "zf_device_absolute_encoder.h" #include "zf_device_bluetooth_ch9141.h" -#include "zf_device_gps_tau1201.h" +#include "zf_device_gnss.h" #include "zf_device_camera.h" #include "zf_device_dl1a.h" #include "zf_device_dl1b.h" @@ -108,6 +108,7 @@ //====================================================应用组件层==================================================== #include "seekfree_assistant.h" +#include "seekfree_assistant_interface.h" //====================================================应用组件层==================================================== //=====================================================用户层====================================================== diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_interrupt.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_interrupt.c index 61058b2..af12fe0 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_interrupt.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_interrupt.c @@ -24,7 +24,7 @@ * 文件名称 zf_common_interrupt * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_interrupt.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_interrupt.h index 99b0e53..f828423 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_interrupt.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_interrupt.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_interrupt * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_typedef.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_typedef.h index bd09f30..9a07c92 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_typedef.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_typedef.h @@ -24,7 +24,7 @@ * 文件名称 zf_common_typedef * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_components/seekfree_assistant.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_components/seekfree_assistant.c index a196e10..0b7cb9d 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_components/seekfree_assistant.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_components/seekfree_assistant.c @@ -1,49 +1,71 @@ /********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ -#include "zf_common_fifo.h" + +#include "zf_common_debug.h" + #include "seekfree_assistant.h" -seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 -static seekfree_assistant_camera_struct seekfree_assistant_camera_data; // 图像上位机协议数据 -static seekfree_assistant_camera_dot_struct seekfree_assistant_camera_dot_data; // 图像上位机打点协议数据 -static seekfree_assistant_camera_buffer_struct seekfree_assistant_camera_buffer; // 图像以及边界缓冲区信息 -static fifo_obj_struct seekfree_assistant_fifo; -static uint8 seekfree_assistant_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE]; // 数据存放数组 -float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 保存接收到的参数 -vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 参数更新标志位 +extern uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length); +extern uint32 seekfree_assistant_receive (uint8 *buff, uint32 length); + +#if (1 == SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE) +#include "zf_common_fifo.h" +static uint8 seekfree_assistant_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE]; // FIFO缓冲区 +static fifo_struct seekfree_assistant_fifo = // FIFO结构体 +{ + .buffer = seekfree_assistant_buffer, + .execution = FIFO_IDLE, + .type = FIFO_DATA_8BIT, + .head = 0, + .end = 0, + .size = SEEKFREE_ASSISTANT_BUFFER_SIZE, + .max = SEEKFREE_ASSISTANT_BUFFER_SIZE, +}; +#endif + +static seekfree_assistant_camera_struct seekfree_assistant_camera_data; // 图像上位机协议数据 +static seekfree_assistant_camera_dot_struct seekfree_assistant_camera_dot_data; // 图像上位机打点协议数据 +static seekfree_assistant_camera_buffer_struct seekfree_assistant_camera_buffer; // 图像以及边界缓冲区信息 + +seekfree_assistant_transfer_callback_function seekfree_assistant_transfer_callback = seekfree_assistant_transfer; // 数据发送函数指针 +seekfree_assistant_receive_callback_function seekfree_assistant_receive_callback = seekfree_assistant_receive; // 数据接收函数指针 + +seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 +float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 保存接收到的参数 +vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT] = {0}; // 参数更新标志位 //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手求和函数 @@ -87,7 +109,7 @@ void seekfree_assistant_camera_data_send (seekfree_assistant_image_type_enum cam seekfree_assistant_camera_data.image_height = height; // 首先发送帧头、功能、摄像头类型、以及宽度高度等信息 - seekfree_assistant_transfer((const uint8 *)&seekfree_assistant_camera_data, sizeof(seekfree_assistant_camera_struct)); + seekfree_assistant_transfer_callback((const uint8 *)&seekfree_assistant_camera_data, sizeof(seekfree_assistant_camera_struct)); // 根据摄像头类型计算图像大小 switch(camera_type) @@ -111,9 +133,8 @@ void seekfree_assistant_camera_data_send (seekfree_assistant_image_type_enum cam // 发送图像数据 if(NULL != image_addr) { - seekfree_assistant_transfer(image_addr, image_size); + seekfree_assistant_transfer_callback(image_addr, image_size); } - } //------------------------------------------------------------------------------------------------------------------- @@ -139,16 +160,15 @@ void seekfree_assistant_camera_dot_send (seekfree_assistant_camera_buffer_struct dot_bytes *= 2; } - // 首先发送帧头、功能、边界编号、坐标长度、点个数 - seekfree_assistant_transfer((const uint8 *)&seekfree_assistant_camera_dot_data, sizeof(seekfree_assistant_camera_dot_struct)); + seekfree_assistant_transfer_callback((const uint8 *)&seekfree_assistant_camera_dot_data, sizeof(seekfree_assistant_camera_dot_struct)); for(i=0; i < SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY; i++) { // 判断是否发送横坐标数据 if(NULL != buffer->boundary_x[i]) { - seekfree_assistant_transfer((const uint8 *)buffer->boundary_x[i], dot_bytes); + seekfree_assistant_transfer_callback((const uint8 *)buffer->boundary_x[i], dot_bytes); } // 判断是否发送纵坐标数据 @@ -156,10 +176,9 @@ void seekfree_assistant_camera_dot_send (seekfree_assistant_camera_buffer_struct { // 如果没有纵坐标数据,则表示每一行只有一个边界 // 指定了横纵坐标数据,这种方式可以实现同一行多个边界的情况,例如搜线算法能够搜索出回弯。 - seekfree_assistant_transfer((const uint8 *)buffer->boundary_y[i], dot_bytes); + seekfree_assistant_transfer_callback((const uint8 *)buffer->boundary_y[i], dot_bytes); } } - } //------------------------------------------------------------------------------------------------------------------- @@ -193,7 +212,7 @@ void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struc // 数据在调用本函数之前,由用户将需要发送的数据写入seekfree_assistant_oscilloscope_data.data[] - seekfree_assistant_transfer((const uint8 *)seekfree_assistant_oscilloscope, packet_size); + seekfree_assistant_transfer_callback((const uint8 *)seekfree_assistant_oscilloscope, packet_size); } //------------------------------------------------------------------------------------------------------------------- @@ -364,12 +383,14 @@ void seekfree_assistant_camera_send (void) } } + //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手解析接收到的数据 // 参数说明 void // 返回参数 void // 使用示例 函数只需要放到周期运行的PIT中断或者主循环即可 //------------------------------------------------------------------------------------------------------------------- +#if (1 == SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE) void seekfree_assistant_data_analysis (void) { uint8 temp_sum; @@ -380,14 +401,13 @@ void seekfree_assistant_data_analysis (void) uint32 temp_buffer[SEEKFREE_ASSISTANT_BUFFER_SIZE / 4]; // 尝试读取数据, 如果不是自定义的传输方式则从接收回调中读取数据 - read_length = seekfree_assistant_receive((uint8 *)temp_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); + read_length = seekfree_assistant_receive_callback((uint8 *)temp_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); if(read_length) { // 将读取到的数据写入FIFO fifo_write_buffer(&seekfree_assistant_fifo, (uint8 *)temp_buffer, read_length); } - while(sizeof(seekfree_assistant_parameter_struct) <= fifo_used(&seekfree_assistant_fifo)) { read_length = sizeof(seekfree_assistant_parameter_struct); @@ -416,21 +436,11 @@ void seekfree_assistant_data_analysis (void) } } - // 丢弃无需使用的数据 fifo_read_buffer(&seekfree_assistant_fifo, (uint8 *)temp_buffer, &read_length, FIFO_READ_AND_CLEAN); } } - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 逐飞助手 初始化 -// 参数说明 -// 返回参数 void -// 使用示例 -//------------------------------------------------------------------------------------------------------------------- -ZF_WEAK void seekfree_assistant_init () -{ - fifo_init(&seekfree_assistant_fifo, FIFO_DATA_8BIT, seekfree_assistant_buffer, SEEKFREE_ASSISTANT_BUFFER_SIZE); -} +#endif + diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_components/seekfree_assistant.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_components/seekfree_assistant.h index d02abb1..ae0f67c 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_components/seekfree_assistant.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_components/seekfree_assistant.h @@ -1,69 +1,75 @@ -/*/********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +/********************************************************************************************************************* +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ #ifndef _seekfree_assistant_h_ #define _seekfree_assistant_h_ #include "zf_common_typedef.h" -#include "zf_common_debug.h" + + +// 1:使能参数调节的功能 0:关闭参数调节的功能 +#define SEEKFREE_ASSISTANT_SET_PARAMETR_ENABLE ( 1 ) + + // 定义接收FIFO大小 -#define SEEKFREE_ASSISTANT_BUFFER_SIZE ( 0x80 ) +#define SEEKFREE_ASSISTANT_BUFFER_SIZE ( 0x80 ) + +// 定义示波器的最大通道数量 +#define SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT ( 0x08 ) + +// 定义参数调试的最大通道数量 +#define SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT ( 0x08 ) + +// 定义图像边线最大数量 +#define SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY ( 0x08 ) + +// 单片机往上位机发送的帧头 +#define SEEKFREE_ASSISTANT_SEND_HEAD ( 0xAA ) + +// 摄像头类 +#define SEEKFREE_ASSISTANT_CAMERA_FUNCTION ( 0x02 ) +#define SEEKFREE_ASSISTANT_CAMERA_DOT_FUNCTION ( 0x03 ) +#define SEEKFREE_ASSISTANT_CAMERA_OSCILLOSCOPE ( 0x10 ) + +// 上位机往单片机发送的帧头 +#define SEEKFREE_ASSISTANT_RECEIVE_HEAD ( 0x55 ) + +// 参数设置类 +#define SEEKFREE_ASSISTANT_RECEIVE_SET_PARAMETER ( 0x20 ) -// 定义示波器的最大通道数量 -#define SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT ( 0x08 ) - -// 定义参数调试的最大通道数量 -#define SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT ( 0x08 ) - -// 定义图像边线最大数量 -#define SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY ( 0x08 ) - -// 单片机往上位机发送的帧头 -#define SEEKFREE_ASSISTANT_SEND_HEAD ( 0xAA ) - -// 摄像头类 -#define SEEKFREE_ASSISTANT_CAMERA_FUNCTION ( 0x02 ) -#define SEEKFREE_ASSISTANT_CAMERA_DOT_FUNCTION ( 0x03 ) -#define SEEKFREE_ASSISTANT_CAMERA_OSCILLOSCOPE ( 0x10 ) - -// 上位机往单片机发送的帧头 -#define SEEKFREE_ASSISTANT_RECEIVE_HEAD ( 0x55 ) - -// 参数设置类 -#define SEEKFREE_ASSISTANT_RECEIVE_SET_PARAMETER ( 0x20 ) // 摄像头类型枚举 typedef enum @@ -91,71 +97,69 @@ typedef enum typedef struct { - uint8 head; // 帧头 - uint8 channel_num; // 高四位为功能字 低四位为通道数量 - uint8 check_sum; // 和校验 - uint8 length; // 包长度 - float data[SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT]; // 通道数据 + uint8 head; // 帧头 + uint8 channel_num; // 高四位为功能字 低四位为通道数量 + uint8 check_sum; // 和校验 + uint8 length; // 包长度 + float data[SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT]; // 通道数据 }seekfree_assistant_oscilloscope_struct; typedef struct { - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 camera_type; // 低四位表示边界数量 第四位表示是否有图像数据 例如0x13:其中3表示一副图像有三条边界(通常是左边界、中线、右边界)、1表示没有图像数据 - uint8 length; // 包长度(仅包含协议部分) - uint16 image_width; // 图像宽度 - uint16 image_height; // 图像高度 -}seekfree_assistant_camera_struct; - - -typedef struct -{ - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 dot_type; // 点类型 BIT5:1:坐标是16位的 0:坐标是8位的 BIT7-BIT6:0:只有X坐标 1:只有Y坐标 2:X和Y坐标都有 BIT3-BIT0:边界数量 - uint8 length; // 包长度(仅包含协议部分) - uint16 dot_num; // 画点数量 - uint8 valid_flag; // 通道标识 - uint8 reserve; // 保留 -}seekfree_assistant_camera_dot_struct; - -typedef struct -{ - void *image_addr; // 摄像头地址 - uint16 width; // 图像宽度 - uint16 height; // 图像高度 - seekfree_assistant_image_type_enum camera_type; // 摄像头类型 - void *boundary_x[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界横坐标数组地址 - void *boundary_y[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界纵坐标数组地址 + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 camera_type; // 低四位表示边界数量 第四位表示是否有图像数据 例如0x13:其中3表示一副图像有三条边界(通常是左边界、中线、右边界)、1表示没有图像数据 + uint8 length; // 包长度(仅包含协议部分) + uint16 image_width; // 图像宽度 + uint16 image_height; // 图像高度 +}seekfree_assistant_camera_struct; + + +typedef struct +{ + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 dot_type; // 点类型 BIT5:1:坐标是16位的 0:坐标是8位的 BIT7-BIT6:0:只有X坐标 1:只有Y坐标 2:X和Y坐标都有 BIT3-BIT0:边界数量 + uint8 length; // 包长度(仅包含协议部分) + uint16 dot_num; // 画点数量 + uint8 valid_flag; // 通道标识 + uint8 reserve; // 保留 +}seekfree_assistant_camera_dot_struct; + +typedef struct +{ + void *image_addr; // 摄像头地址 + uint16 width; // 图像宽度 + uint16 height; // 图像高度 + seekfree_assistant_image_type_enum camera_type; // 摄像头类型 + void *boundary_x[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界横坐标数组地址 + void *boundary_y[SEEKFREE_ASSISTANT_CAMERA_MAX_BOUNDARY]; // 边界纵坐标数组地址 }seekfree_assistant_camera_buffer_struct; typedef struct { - uint8 head; // 帧头 - uint8 function; // 功能字 - uint8 channel; // 通道 - uint8 check_sum; // 和校验 - float data; // 数据 + uint8 head; // 帧头 + uint8 function; // 功能字 + uint8 channel; // 通道 + uint8 check_sum; // 和校验 + float data; // 数据 }seekfree_assistant_parameter_struct; +typedef uint32 (*seekfree_assistant_transfer_callback_function) (const uint8 *buff, uint32 length); +typedef uint32 (*seekfree_assistant_receive_callback_function) (uint8 *buff, uint32 length); -extern seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 -extern float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 保存接收到的参数 -extern vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 参数更新标志位 +extern seekfree_assistant_oscilloscope_struct seekfree_assistant_oscilloscope_data; // 虚拟示波器数据 +extern float seekfree_assistant_parameter[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 保存接收到的参数 +extern vuint8 seekfree_assistant_parameter_update_flag[SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT]; // 参数更新标志位 + + +void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struct *seekfree_assistant_oscilloscope); +void seekfree_assistant_camera_information_config (seekfree_assistant_image_type_enum camera_type, void *image_addr, uint16 width, uint16 height); +void seekfree_assistant_camera_boundary_config (seekfree_assistant_boundary_type_enum boundary_type, uint16 dot_num, void *dot_x1, void *dot_x2, void *dot_x3, void *dot_y1, void *dot_y2, void *dot_y3); +void seekfree_assistant_camera_send (void); +void seekfree_assistant_data_analysis (void); -uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length); -uint32 seekfree_assistant_receive (uint8 *buff, uint32 length); - -void seekfree_assistant_oscilloscope_send (seekfree_assistant_oscilloscope_struct *seekfree_assistant_oscilloscope); - -void seekfree_assistant_camera_information_config (seekfree_assistant_image_type_enum camera_type, void *image_addr, uint16 width, uint16 height); -void seekfree_assistant_camera_boundary_config (seekfree_assistant_boundary_type_enum boundary_type, uint16 dot_num, void *dot_x1, void *dot_x2, void *dot_x3, void *dot_y1, void *dot_y2, void *dot_y3); -void seekfree_assistant_camera_send (void); - -void seekfree_assistant_data_analysis (void); -void seekfree_assistant_init (void); #endif diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_components/seekfree_assistant_interface.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_components/seekfree_assistant_interface.c index 99dbeef..fdade63 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_components/seekfree_assistant_interface.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_components/seekfree_assistant_interface.c @@ -1,42 +1,55 @@ /********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 * Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 * 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* +* * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 甚至没有隐含的适销性或适合特定用途的保证 * 更多细节请参见 GPL -* +* * 您应该在收到本开源库的同时收到一份 GPL 的副本 * 如果没有,请参阅 -* +* * 额外注明: * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* +* * 文件名称 seekfree_assistant_interface * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 -* 日期 作者 备注 -* 2023-11-29 pudding first version +* 日期 作者 备注 +* 2024-1-11 SeekFree first version ********************************************************************************************************************/ #include "zf_common_typedef.h" +#include "zf_common_fifo.h" #include "zf_common_debug.h" +#include "zf_driver_uart.h" +#include "zf_device_wireless_uart.h" +#include "zf_device_bluetooth_ch9141.h" +#include "zf_device_wifi_uart.h" +#include "zf_device_wifi_spi.h" #include "seekfree_assistant.h" +#include "seekfree_assistant_interface.h" + + +extern seekfree_assistant_transfer_callback_function seekfree_assistant_transfer_callback; // 数据发送函数指针 +extern seekfree_assistant_receive_callback_function seekfree_assistant_receive_callback; // 数据接收函数指针 + + //------------------------------------------------------------------------------------------------------------------- // 函数简介 逐飞助手发送函数 // 参数说明 *buff 需要发送的数据地址 @@ -46,11 +59,9 @@ //------------------------------------------------------------------------------------------------------------------- ZF_WEAK uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length) { - uint32 len = 0; - - len = debug_send_buffer(buff, length); - - return len; + + // 当选择自定义通讯方式时 需要自行完成数据发送功能 + return length; } //------------------------------------------------------------------------------------------------------------------- @@ -62,11 +73,57 @@ ZF_WEAK uint32 seekfree_assistant_transfer (const uint8 *buff, uint32 length) //------------------------------------------------------------------------------------------------------------------- ZF_WEAK uint32 seekfree_assistant_receive (uint8 *buff, uint32 length) { - uint32 len = 0; + // 当选择自定义通讯方式时 需要自行完成数据接收功能 + return 0; +} - len = debug_read_ring_buffer(buff, length); - - return len; +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 逐飞助手接口 初始化 +// 参数说明 +// 返回参数 void +// 使用示例 seekfree_assistant_interface_init(SEEKFREE_ASSISTANT_WIFI_SPI); 使用高速WIFI SPI模块进行数据收发 +// 备注 需要自行调用设备的初始化,例如使用无线转串口进行数据的收发,则需要自行调用无线转串口的初始化,然后再调用seekfree_assistant_interface_init完成逐飞助手的接口初始化 +//------------------------------------------------------------------------------------------------------------------- +ZF_WEAK void seekfree_assistant_interface_init (seekfree_assistant_transfer_device_enum transfer_device) +{ + switch(transfer_device) + { + case SEEKFREE_ASSISTANT_DEBUG_UART: + { + seekfree_assistant_transfer_callback = debug_send_buffer; + seekfree_assistant_receive_callback = debug_read_ring_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIRELESS_UART: + { + seekfree_assistant_transfer_callback = wireless_uart_send_buffer; + seekfree_assistant_receive_callback = wireless_uart_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_CH9141: + { + seekfree_assistant_transfer_callback = bluetooth_ch9141_send_buffer; + seekfree_assistant_receive_callback = bluetooth_ch9141_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIFI_UART: + { + seekfree_assistant_transfer_callback = wifi_uart_send_buffer; + seekfree_assistant_receive_callback = wifi_uart_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_WIFI_SPI: + { + seekfree_assistant_transfer_callback = wifi_spi_send_buffer; + seekfree_assistant_receive_callback = wifi_spi_read_buffer; + }break; + + case SEEKFREE_ASSISTANT_CUSTOM: + { + // 根据自己的需求 自行实现seekfree_assistant_transfer与seekfree_assistant_receive函数,完成数据的收发 + + }break; + } } diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_components/seekfree_assistant_interface.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_components/seekfree_assistant_interface.h new file mode 100644 index 0000000..940b5f7 --- /dev/null +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_components/seekfree_assistant_interface.h @@ -0,0 +1,57 @@ +/********************************************************************************************************************* +* RT1064DVL6A Opensourec Library 即(RT1064DVL6A 开源库)是一个基于官方 SDK 接口的第三方开源库 +* Copyright (c) 2022 SEEKFREE 逐飞科技 +* +* 本文件是 RT1064DVL6A 开源库的一部分 +* +* RT1064DVL6A 开源库 是免费软件 +* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 +* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 +* +* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 +* 甚至没有隐含的适销性或适合特定用途的保证 +* 更多细节请参见 GPL +* +* 您应该在收到本开源库的同时收到一份 GPL 的副本 +* 如果没有,请参阅 +* +* 额外注明: +* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 +* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 +* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 +* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) +* +* 文件名称 seekfree_assistant_interface +* 公司名称 成都逐飞科技有限公司 +* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 +* 开发环境 IAR 8.32.4 or MDK 5.33 +* 适用平台 RT1064DVL6A +* 店铺链接 https://seekfree.taobao.com/ +* +* 修改记录 +* 日期 作者 备注 +* 2024-1-11 SeekFree first version +********************************************************************************************************************/ + +#ifndef _seekfree_assistant_interface_h_ +#define _seekfree_assistant_interface_h_ + + + +// 数据发送设备枚举 +typedef enum +{ + SEEKFREE_ASSISTANT_DEBUG_UART, // 调试串口 使用的串口由DEBUG_UART_INDEX宏定义指定 + SEEKFREE_ASSISTANT_WIRELESS_UART, // 无线转串口 + SEEKFREE_ASSISTANT_CH9141, // CH9141蓝牙 + SEEKFREE_ASSISTANT_WIFI_UART, // WIFI转串口 + SEEKFREE_ASSISTANT_WIFI_SPI, // 高速WIFI SPI + SEEKFREE_ASSISTANT_CUSTOM, // 自定义通讯方式 需要自行seekfree_assistant_transfer与seekfree_assistant_receive函数 +}seekfree_assistant_transfer_device_enum; + + +void seekfree_assistant_interface_init (seekfree_assistant_transfer_device_enum transfer_device); + + + +#endif diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_absolute_encoder.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_absolute_encoder.c index 7c80a3b..f9bc809 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_absolute_encoder.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_absolute_encoder.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_absolute_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_absolute_encoder.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_absolute_encoder.h index e6cc057..ed92906 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_absolute_encoder.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_absolute_encoder.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_absolute_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c index 500bccb..b0a06df 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_bluetooth_ch9141 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -54,7 +54,7 @@ #include "zf_device_camera.h" #include "zf_device_bluetooth_ch9141.h" -static fifo_obj_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 +static fifo_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 static uint8 bluetooth_ch9141_buffer[BLUETOOTH_CH9141_BUFFER_SIZE]; // 数据存放数组 static uint8 bluetooth_ch9141_data = 0; // 数据临时存放变量 diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h index 800be6c..ffb30b5 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h @@ -24,7 +24,7 @@ * 文件名称 main * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_camera.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_camera.c index 84c7aa0..68668c4 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_camera.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_camera.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_camera * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -45,7 +45,7 @@ #include "zf_device_camera.h" -fifo_obj_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 +fifo_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; // 定义摄像头接收数据缓冲区 uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // 定义摄像头数据发送到上位机的帧头 diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_camera.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_camera.h index 58efb06..2cd7d2d 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_camera.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_camera.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_camera * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -44,7 +44,7 @@ //=================================================摄像头公共库 基本配置================================================ #define CAMERA_RECEIVER_BUFFER_SIZE (8) // 定义摄像头接收数据缓冲区大小 -extern fifo_obj_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 +extern fifo_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 extern uint8 camera_send_image_frame_header[4]; // 声明摄像头数据发送到上位机的帧头 //=================================================摄像头公共库 基本配置================================================ diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_config.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_config.h index af6a3d8..6c8147d 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_config.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_config.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_config * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_dl1a.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_dl1a.c index 3e7410c..27be3a7 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_dl1a.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_dl1a.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1a * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_dl1a.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_dl1a.h index 89145d3..3176dd3 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_dl1a.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_dl1a.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1a * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_dl1b.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_dl1b.c index 90e64b3..96e472e 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_dl1b.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_dl1b.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1b * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_dl1b.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_dl1b.h index b144739..922b3ce 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_dl1b.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_dl1b.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_dl1b * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_gnss.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_gnss.c new file mode 100644 index 0000000..caf7cd0 --- /dev/null +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_gnss.c @@ -0,0 +1,620 @@ +/********************************************************************************************************************* +* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* Copyright (c) 2022 SEEKFREE 逐飞科技 +* +* 本文件是 TC264 开源库的一部分 +* +* TC264 开源库 是免费软件 +* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 +* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 +* +* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 +* 甚至没有隐含的适销性或适合特定用途的保证 +* 更多细节请参见 GPL +* +* 您应该在收到本开源库的同时收到一份 GPL 的副本 +* 如果没有,请参阅 +* +* 额外注明: +* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 +* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 +* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 +* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) +* +* 文件名称 zf_device_gnss +* 公司名称 成都逐飞科技有限公司 +* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 +* 开发环境 ADS v1.9.20 +* 适用平台 TC264D +* 店铺链接 https://seekfree.taobao.com/ +* +* 修改记录 +* 日期 作者 备注 +* 2023-12-28 pudding first version +********************************************************************************************************************/ +/********************************************************************************************************************* +* 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* RX 查看 zf_device_gnss.h 中 GNSS_RX 宏定义 +* TX 查看 zf_device_gnss.h 中 GNSS_TX 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* ------------------------------------ +********************************************************************************************************************/ + +#include "math.h" +#include "zf_common_function.h" +#include "zf_common_fifo.h" +#include "zf_driver_delay.h" +#include "zf_driver_uart.h" + +#include "zf_device_gnss.h" + +#define GNSS_BUFFER_SIZE ( 128 ) + +uint8 gnss_flag = 0; // 1:采集完成等待处理数据 0:没有采集完成 +gnss_info_struct gnss; // GPS解析之后的数据 + +static uint8 gnss_state = 0; // 1:GPS初始化完成 +static fifo_struct gnss_receiver_fifo; // +static uint8 gnss_receiver_buffer[GNSS_BUFFER_SIZE]; // 数据存放数组 + +static gps_state_enum gnss_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 +static gps_state_enum gnss_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 +static gps_state_enum gnss_ths_state = GPS_STATE_RECEIVING; // rmc 语句状态 + +static uint8 gps_gga_buffer[GNSS_BUFFER_SIZE]; +static uint8 gps_rmc_buffer[GNSS_BUFFER_SIZE]; +static uint8 gps_ths_buffer[GNSS_BUFFER_SIZE]; + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 获取指定 ',' 后面的索引 +// 参数说明 num 第几个逗号 +// 参数说明 *str 字符串 +// 返回参数 uint8 返回索引 +// 使用示例 get_parameter_index(1, s); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 get_parameter_index (uint8 num, char *str) +{ + uint8 i = 0, j = 0; + char *temp = strchr(str, '\n'); + uint8 len = 0, len1 = 0; + + 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; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 给定字符串第一个 ',' 之前的数据转换为int +// 参数说明 *s 字符串 +// 返回参数 float 返回数值 +// 使用示例 get_int_number(&buf[get_parameter_index(7, buf)]); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static int get_int_number (char *s) +{ + char buf[10]; + uint8 i = 0; + int return_value = 0; + i = get_parameter_index(1, s); + i = i - 1; + strncpy(buf, s, i); + buf[i] = 0; + return_value = func_str_to_int(buf); + return return_value; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 给定字符串第一个 ',' 之前的数据转换为float +// 参数说明 *s 字符串 +// 返回参数 float 返回数值 +// 使用示例 get_float_number(&buf[get_parameter_index(8, buf)]); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static float get_float_number (char *s) +{ + uint8 i = 0; + char buf[15]; + float return_value = 0; + + i = get_parameter_index(1, s); + i = i - 1; + strncpy(buf, s, i); + buf[i] = 0; + return_value = (float)func_str_to_double(buf); + return return_value; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 给定字符串第一个 ',' 之前的数据转换为double +// 参数说明 *s 字符串 +// 返回参数 double 返回数值 +// 使用示例 get_double_number(&buf[get_parameter_index(3, buf)]); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static double get_double_number (char *s) +{ + uint8 i = 0; + char buf[15]; + double return_value = 0; + + i = get_parameter_index(1, s); + i = i - 1; + strncpy(buf, s, i); + buf[i] = 0; + return_value = func_str_to_double(buf); + return return_value; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 世界时间转换为北京时间 +// 参数说明 *time 保存的时间 +// 返回参数 void +// 使用示例 utc_to_btc(&gnss->time); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static void utc_to_btc (gps_time_struct *time) +{ + uint8 day_num = 0; + + time->hour = time->hour + 8; + if(23 < time->hour) + { + time->hour -= 24; + time->day += 1; + + if(2 == time->month) + { + day_num = 28; + if((0 == time->year % 4 && 0 != time->year % 100) || 0 == time->year % 400) // 判断是否为闰年 + { + day_num ++; // 闰月 2月为29天 + } + } + else + { + day_num = 31; // 1 3 5 7 8 10 12这些月份为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(12 < time->month) + { + time->month -= 12; + time->year ++; + } + } + } +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 RMC语句解析 +// 参数说明 *line 接收到的语句信息 +// 参数说明 *gnss 保存解析后的数据 +// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 +// 使用示例 gps_gnrmc_parse((char *)data_buffer, &gnss); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 gps_gnrmc_parse (char *line, gnss_info_struct *gnss) +{ + uint8 state = 0, temp = 0; + + double latitude = 0; // 纬度 + double longitude = 0; // 经度 + + double lati_cent_tmp = 0, lati_second_tmp = 0; + double long_cent_tmp = 0, long_second_tmp = 0; + float speed_tmp = 0; + char *buf = line; + uint8 return_state = 0; + + state = buf[get_parameter_index(2, buf)]; + + if('A' == state) // 如果数据有效 则解析数据 + { + return_state = 1; + gnss->state = 1; + gnss -> ns = buf[get_parameter_index(4, buf)]; + gnss -> 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)]); + + gnss->latitude_degree = (int)latitude / 100; // 纬度转换为度分秒 + lati_cent_tmp = (latitude - gnss->latitude_degree * 100); + gnss->latitude_cent = (int)lati_cent_tmp; + lati_second_tmp = (lati_cent_tmp - gnss->latitude_cent) * 6000; + gnss->latitude_second = (int)lati_second_tmp; + + gnss->longitude_degree = (int)longitude / 100; // 经度转换为度分秒 + long_cent_tmp = (longitude - gnss->longitude_degree * 100); + gnss->longitude_cent = (int)long_cent_tmp; + long_second_tmp = (long_cent_tmp - gnss->longitude_cent) * 6000; + gnss->longitude_second = (int)long_second_tmp; + + gnss->latitude = gnss->latitude_degree + lati_cent_tmp / 60; + gnss->longitude = gnss->longitude_degree + long_cent_tmp / 60; + + speed_tmp = get_float_number(&buf[get_parameter_index(7, buf)]); // 速度(海里/小时) + gnss->speed = speed_tmp * 1.85f; // 转换为公里/小时 + gnss->direction = get_float_number(&buf[get_parameter_index(8, buf)]); // 角度 + } + else + { + gnss->state = 0; + } + + // 在定位没有生效前也是有时间数据的,可以直接解析 + gnss->time.hour = (buf[7] - '0') * 10 + (buf[8] - '0'); // 时间 + gnss->time.minute = (buf[9] - '0') * 10 + (buf[10] - '0'); + gnss->time.second = (buf[11] - '0') * 10 + (buf[12] - '0'); + temp = get_parameter_index(9, buf); + gnss->time.day = (buf[temp + 0] - '0') * 10 + (buf[temp + 1] - '0'); // 日期 + gnss->time.month = (buf[temp + 2] - '0') * 10 + (buf[temp + 3] - '0'); + gnss->time.year = (buf[temp + 4] - '0') * 10 + (buf[temp + 5] - '0') + 2000; + + utc_to_btc(&gnss->time); + + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 GGA语句解析 +// 参数说明 *line 接收到的语句信息 +// 参数说明 *gnss 保存解析后的数据 +// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 +// 使用示例 gps_gngga_parse((char *)data_buffer, &gnss); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 gps_gngga_parse (char *line, gnss_info_struct *gnss) +{ + uint8 state = 0; + char *buf = line; + uint8 return_state = 0; + + state = buf[get_parameter_index(2, buf)]; + + if(',' != state) + { + gnss->satellite_used = (uint8)get_int_number(&buf[get_parameter_index(7, buf)]); + gnss->height = get_float_number(&buf[get_parameter_index(9, buf)]) + get_float_number(&buf[get_parameter_index(11, buf)]); // 高度 = 海拔高度 + 地球椭球面相对大地水准面的高度 + return_state = 1; + } + + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 THS语句解析 +// 参数说明 *line 接收到的语句信息 +// 参数说明 *gnss 保存解析后的数据 +// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 +// 使用示例 gps_gnths_parse((char *)data_buffer, &gnss); +// 备注信息 内部使用 +//------------------------------------------------------------------------------------------------------------------- +static uint8 gps_gnths_parse (char *line, gnss_info_struct *gnss) +{ + uint8 state = 0; + char *buf = line; + uint8 return_state = 0; + + state = buf[get_parameter_index(2, buf)]; + + if('A' == state) + { + gnss->antenna_direction_state = 1; + gnss->antenna_direction = get_float_number(&buf[get_parameter_index(1, buf)]); + return_state = 1; + } + else + { + gnss->antenna_direction_state = 0; + } + + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 计算从第一个点到第二个点的距离 +// 参数说明 latitude1 第一个点的纬度 +// 参数说明 longitude1 第一个点的经度 +// 参数说明 latitude2 第二个点的纬度 +// 参数说明 longitude2 第二个点的经度 +// 返回参数 double 返回两点距离 +// 使用示例 get_two_points_distance(latitude1_1, longitude1, latitude2, longitude2); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +double get_two_points_distance (double latitude1, double longitude1, double latitude2, double longitude2) +{ + const double EARTH_RADIUS = 6378137; // 地球半径(单位:m) + double rad_latitude1 = 0; + double rad_latitude2 = 0; + double rad_longitude1 = 0; + double rad_longitude2 = 0; + double distance = 0; + double a = 0; + double b = 0; + + rad_latitude1 = ANGLE_TO_RAD(latitude1); // 根据角度计算弧度 + 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 里面实现的算法 + distance = distance * EARTH_RADIUS; + + return distance; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 计算从第一个点到第二个点的方位角 +// 参数说明 latitude1 第一个点的纬度 +// 参数说明 longitude1 第一个点的经度 +// 参数说明 latitude2 第二个点的纬度 +// 参数说明 longitude2 第二个点的经度 +// 返回参数 double 返回方位角(0至360) +// 使用示例 get_two_points_azimuth(latitude1_1, longitude1, latitude2, longitude2); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +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 ((0 < angle) ? angle : (angle + 360)); +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 解析GPS数据 +// 参数说明 void +// 返回参数 uint8 0-解析成功 1-解析失败 可能数据包错误 +// 使用示例 gps_data_parse(); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +uint8 gnss_data_parse (void) +{ + uint8 return_state = 0; + uint8 check_buffer[5] = {'0', 'x', 0x00, 0x00, 0x00}; + uint8 bbc_xor_origin = 0; + uint8 bbc_xor_calculation = 0; + uint32 data_len = 0; + + do + { + if(GPS_STATE_RECEIVED == gnss_rmc_state) + { + gnss_rmc_state = GPS_STATE_PARSING; + strncpy((char *)&check_buffer[2], strchr((const char *)gps_rmc_buffer, '*') + 1, 2); + bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); + for(bbc_xor_calculation = gps_rmc_buffer[1], data_len = 2; '*' != gps_rmc_buffer[data_len]; data_len ++) + { + bbc_xor_calculation ^= gps_rmc_buffer[data_len]; + } + if(bbc_xor_calculation != bbc_xor_origin) + { + // 数据校验失败 + return_state = 1; + break; + } + + gps_gnrmc_parse((char *)gps_rmc_buffer, &gnss); + } + gnss_rmc_state = GPS_STATE_RECEIVING; + + if(GPS_STATE_RECEIVED == gnss_gga_state) + { + gnss_gga_state = GPS_STATE_PARSING; + strncpy((char *)&check_buffer[2], strchr((const char *)gps_gga_buffer, '*') + 1, 2); + bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); + + for(bbc_xor_calculation = gps_gga_buffer[1], data_len = 2; '*' != gps_gga_buffer[data_len]; data_len ++) + { + bbc_xor_calculation ^= gps_gga_buffer[data_len]; + } + if(bbc_xor_calculation != bbc_xor_origin) + { + // 数据校验失败 + return_state = 1; + break; + } + + gps_gngga_parse((char *)gps_gga_buffer, &gnss); + } + gnss_gga_state = GPS_STATE_RECEIVING; + + if(GPS_STATE_RECEIVED == gnss_ths_state) + { + gnss_ths_state = GPS_STATE_PARSING; + strncpy((char *)&check_buffer[2], strchr((const char *)gps_ths_buffer, '*') + 1, 2); + bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); + + for(bbc_xor_calculation = gps_ths_buffer[1], data_len = 2; '*' != gps_ths_buffer[data_len]; data_len ++) + { + bbc_xor_calculation ^= gps_ths_buffer[data_len]; + } + if(bbc_xor_calculation != bbc_xor_origin) + { + // 数据校验失败 + return_state = 1; + break; + } + + gps_gnths_parse((char *)gps_ths_buffer, &gnss); + } + gnss_ths_state = GPS_STATE_RECEIVING; + + }while(0); + return return_state; +} + + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 GPS串口回调函数 +// 参数说明 void +// 返回参数 void +// 使用示例 gps_uart_callback(); +// 备注信息 此函数需要在串口接收中断内进行调用 +//------------------------------------------------------------------------------------------------------------------- +void gnss_uart_callback (void) +{ + uint8 temp_gps[6]; + uint32 temp_length = 0; + + + + + if(gnss_state) + { + uint8 dat; + while(uart_query_byte(GNSS_UART, &dat)) + { + fifo_write_buffer(&gnss_receiver_fifo, &dat, 1); + } + + if('\n' == dat) + { + // 读取前6个数据 用于判断语句类型 + temp_length = 6; + fifo_read_buffer(&gnss_receiver_fifo, temp_gps, &temp_length, FIFO_READ_ONLY); + + // 根据不同类型将数据拷贝到不同的缓冲区 + if(0 == strncmp((char *)&temp_gps[3], "RMC", 3)) + { + // 如果没有在解析数据则更新缓冲区的数据 + if(GPS_STATE_PARSING != gnss_rmc_state) + { + gnss_rmc_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_rmc_buffer, &temp_length, FIFO_READ_AND_CLEAN); + } + } + else if(0 == strncmp((char *)&temp_gps[3], "GGA", 3)) + { + // 如果没有在解析数据则更新缓冲区的数据 + if(GPS_STATE_PARSING != gnss_gga_state) + { + gnss_gga_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_gga_buffer, &temp_length, FIFO_READ_AND_CLEAN); + } + } + else if(0 == strncmp((char *)&temp_gps[3], "THS", 3)) + { + // 如果没有在解析数据则更新缓冲区的数据 + if(GPS_STATE_PARSING != gnss_ths_state) + { + gnss_ths_state = GPS_STATE_RECEIVED; + temp_length = fifo_used(&gnss_receiver_fifo); + fifo_read_buffer(&gnss_receiver_fifo, gps_ths_buffer, &temp_length, FIFO_READ_AND_CLEAN); + } + } + + // 统一将FIFO清空 + fifo_clear(&gnss_receiver_fifo); + + gnss_flag = 1; + } + } +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 GPS初始化 +// 参数说明 void +// 返回参数 void +// 使用示例 gps_init(); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +void gnss_init (gps_device_enum gps_device) +{ + 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}; + + if((TAU1201 == gps_device) || (GN42A == gps_device)) + { + fifo_init(&gnss_receiver_fifo, FIFO_DATA_8BIT, gnss_receiver_buffer, GNSS_BUFFER_SIZE); + system_delay_ms(500); // 等待GPS启动后开始初始化 + uart_init(GNSS_UART, 115200, GNSS_RX, GNSS_TX); + + uart_write_buffer(GNSS_UART, (uint8 *)set_rate, sizeof(set_rate)); // 设置GPS更新速率为10hz 如果不调用此语句则默认为1hz + system_delay_ms(200); + + uart_write_buffer(GNSS_UART, (uint8 *)open_rmc, sizeof(open_rmc)); // 开启rmc语句 + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)open_gga, sizeof(open_gga)); // 开启gga语句 + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gll, sizeof(close_gll)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gsa, sizeof(close_gsa)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_grs, sizeof(close_grs)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gsv, sizeof(close_gsv)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_vtg, sizeof(close_vtg)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_zda, sizeof(close_zda)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_gst, sizeof(close_gst)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_txt, sizeof(close_txt)); + system_delay_ms(50); + uart_write_buffer(GNSS_UART, (uint8 *)close_txt_ant, sizeof(close_txt_ant)); + system_delay_ms(50); + + gnss_state = 1; + uart_rx_interrupt(GNSS_UART, 1); + } + else if(GN43RFA == gps_device) + { + // GN43RFA RTK模块不需要进行参数设置,如果需要修改参数应该使用专用的上位机修改参数 + fifo_init(&gnss_receiver_fifo, FIFO_DATA_8BIT, gnss_receiver_buffer, GNSS_BUFFER_SIZE); + uart_init(GNSS_UART, 115200, GNSS_RX, GNSS_TX); + gnss_state = 1; + uart_rx_interrupt(GNSS_UART, 1); + } + +} diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_gnss.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_gnss.h new file mode 100644 index 0000000..5d58976 --- /dev/null +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_gnss.h @@ -0,0 +1,125 @@ +/********************************************************************************************************************* +* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 +* Copyright (c) 2022 SEEKFREE 逐飞科技 +* +* 本文件是 TC264 开源库的一部分 +* +* TC264 开源库 是免费软件 +* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 +* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 +* +* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 +* 甚至没有隐含的适销性或适合特定用途的保证 +* 更多细节请参见 GPL +* +* 您应该在收到本开源库的同时收到一份 GPL 的副本 +* 如果没有,请参阅 +* +* 额外注明: +* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 +* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 +* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 +* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) +* +* 文件名称 zf_device_gnss +* 公司名称 成都逐飞科技有限公司 +* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 +* 开发环境 ADS v1.9.20 +* 适用平台 TC264D +* 店铺链接 https://seekfree.taobao.com/ +* +* 修改记录 +* 日期 作者 备注 +* 2023-12-28 pudding first version +********************************************************************************************************************/ +/********************************************************************************************************************* +* 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* RX 查看 zf_device_gnss.h 中 GNSS_RX 宏定义 +* TX 查看 zf_device_gnss.h 中 GNSS_TX 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* ------------------------------------ +********************************************************************************************************************/ + +#ifndef _zf_device_gnss_h_ +#define _zf_device_gnss_h_ + +#include "zf_common_typedef.h" + +//-------------------------------------------------------------------------------------------------- +//引脚配置 +//-------------------------------------------------------------------------------------------------- +#define GNSS_UART (UART_3) +#define GNSS_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 +#define GNSS_TX (UART3_RX_P15_7) // GPS TX串口引脚 + +#define ANGLE_TO_RAD(x) ( (x) * PI / 180.0 ) // 角度转换为弧度 +#define RAD_TO_ANGLE(x) ( (x) * 180.0 / PI ) // 弧度转换为角度 +#define PI ( 3.1415926535898 ) + +typedef enum +{ + TAU1201 = 1, // 逐飞科技双频GPS模块 + GN42A = 1, // 逐飞科技双频GPS模块 与TAU1201是一样的 + GN43RFA = 2, // 逐飞科技三频RTK模块 +}gps_device_enum; + +typedef struct +{ + uint16 year; + uint8 month; + uint8 day; + uint8 hour; + uint8 minute; + uint8 second; +}gps_time_struct; + +typedef struct +{ + gps_time_struct time; // 时间 + + uint8 state; // 有效状态 1:定位有效 0:定位无效 + + uint16 latitude_degree; // 度 + uint16 latitude_cent; // 分 + uint16 latitude_second; // 秒 这里的秒是被放大了100倍的,主要是避免使用浮点数 + uint16 longitude_degree; // 度 + uint16 longitude_cent; // 分 + uint16 longitude_second; // 秒 这里的秒是被放大了100倍的,主要是避免使用浮点数 + + double latitude; // 纬度 + double longitude; // 经度 + + int8 ns; // 纬度半球 N(北半球)或 S(南半球) + int8 ew; // 经度半球 E(东经)或 W(西经) + + float speed; // 速度(公里/每小时) + float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准)+ + uint8 antenna_direction_state; // 双天线测向有效状态 1:测向有效 0:测向无效,无效时antenna_direction数据是无效的 + float antenna_direction; // 主天线指向从天线与真北构成的夹角(000.0~359.9 度) + + // 下面两个个信息从GNGGA语句中获取 + uint8 satellite_used; // 用于定位的卫星数量 + float height; // 高度 +}gnss_info_struct; + +typedef enum +{ + GPS_STATE_RECEIVING, // 正在接收数据 + GPS_STATE_RECEIVED, // 数据接收完成 + GPS_STATE_PARSING, // 正在解析 +}gps_state_enum; + +extern gnss_info_struct gnss; +extern uint8 gnss_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); +uint8 gnss_data_parse (void); +void gnss_uart_callback (void); +void gnss_init (gps_device_enum gps_device); + +#endif diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_gps_tau1201.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_gps_tau1201.c deleted file mode 100644 index da46a99..0000000 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_gps_tau1201.c +++ /dev/null @@ -1,541 +0,0 @@ -/********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 -* Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 -* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 -* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* -* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 -* 甚至没有隐含的适销性或适合特定用途的保证 -* 更多细节请参见 GPL -* -* 您应该在收到本开源库的同时收到一份 GPL 的副本 -* 如果没有,请参阅 -* -* 额外注明: -* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 -* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 -* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 -* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* -* 文件名称 zf_device_gps_tau1201 -* 公司名称 成都逐飞科技有限公司 -* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D -* 店铺链接 https://seekfree.taobao.com/ -* -* 修改记录 -* 日期 作者 备注 -* 2022-09-15 pudding first version -* 2023-04-28 pudding 增加中文注释说明 -********************************************************************************************************************/ -/******************************************************************************************************************** -* 接线定义: -* ------------------------------------ -* 模块管脚 单片机管脚 -* RX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_RX 宏定义 -* TX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_TX 宏定义 -* VCC 3.3V电源 -* GND 电源地 -* ------------------------------------ -********************************************************************************************************************/ - -#include "math.h" -#include "zf_common_function.h" -#include "zf_common_fifo.h" -#include "zf_driver_delay.h" -#include "zf_driver_uart.h" - -#include "zf_device_gps_tau1201.h" - -#define GPS_TAU1201_BUFFER_SIZE ( 128 ) - -uint8 gps_tau1201_flag = 0; // 1:采集完成等待处理数据 0:没有采集完成 -gps_info_struct gps_tau1201; // GPS解析之后的数据 - -static uint8 gps_tau1201_state = 0; // 1:GPS初始化完成 -static fifo_obj_struct gps_tau1201_receiver_fifo; // -static uint8 gps_tau1201_receiver_buffer[GPS_TAU1201_BUFFER_SIZE]; // 数据存放数组 - -gps_state_enum gps_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 -gps_state_enum gps_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 - -static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; // GGA语句缓冲区 -static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; // RMC语句缓冲区 - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 获取指定 ',' 后面的索引 -// 参数说明 num 第几个逗号 -// 参数说明 *str 字符串 -// 返回参数 uint8 返回索引 -// 使用示例 get_parameter_index(1, s); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static uint8 get_parameter_index (uint8 num, char *str) -{ - uint8 i = 0, j = 0; - char *temp = strchr(str, '\n'); - uint8 len = 0, len1 = 0; - - 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; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 给定字符串第一个 ',' 之前的数据转换为int -// 参数说明 *s 字符串 -// 返回参数 float 返回数值 -// 使用示例 get_int_number(&buf[get_parameter_index(7, buf)]); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static int get_int_number (char *s) -{ - char buf[10]; - uint8 i = 0; - int return_value = 0; - i = get_parameter_index(1, s); - i = i - 1; - strncpy(buf, s, i); - buf[i] = 0; - return_value = func_str_to_int(buf); - return return_value; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 给定字符串第一个 ',' 之前的数据转换为float -// 参数说明 *s 字符串 -// 返回参数 float 返回数值 -// 使用示例 get_float_number(&buf[get_parameter_index(8, buf)]); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static float get_float_number (char *s) -{ - uint8 i = 0; - char buf[15]; - float return_value = 0; - - i = get_parameter_index(1, s); - i = i - 1; - strncpy(buf, s, i); - buf[i] = 0; - return_value = (float)func_str_to_double(buf); - return return_value; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 给定字符串第一个 ',' 之前的数据转换为double -// 参数说明 *s 字符串 -// 返回参数 double 返回数值 -// 使用示例 get_double_number(&buf[get_parameter_index(3, buf)]); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static double get_double_number (char *s) -{ - uint8 i = 0; - char buf[15]; - double return_value = 0; - - i = get_parameter_index(1, s); - i = i - 1; - strncpy(buf, s, i); - buf[i] = 0; - return_value = func_str_to_double(buf); - return return_value; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 世界时间转换为北京时间 -// 参数说明 *time 保存的时间 -// 返回参数 void -// 使用示例 utc_to_btc(&gps->time); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static void utc_to_btc (gps_time_struct *time) -{ - uint8 day_num = 0; - - time->hour = time->hour + 8; - if(23 < time->hour) - { - time->hour -= 24; - time->day += 1; - - if(2 == time->month) - { - day_num = 28; - if((0 == time->year % 4 && 0 != time->year % 100) || 0 == time->year % 400) // 判断是否为闰年 - { - day_num ++; // 闰月 2月为29天 - } - } - else - { - day_num = 31; // 1 3 5 7 8 10 12这些月份为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(12 < time->month) - { - time->month -= 12; - time->year ++; - } - } - } -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 RMC语句解析 -// 参数说明 *line 接收到的语句信息 -// 参数说明 *gps 保存解析后的数据 -// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 -// 使用示例 gps_gnrmc_parse((char *)data_buffer, &gps_tau1201); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static uint8 gps_gnrmc_parse (char *line, gps_info_struct *gps) -{ - uint8 state = 0, temp = 0; - - double latitude = 0; // 纬度 - double longitude = 0; // 经度 - - double lati_cent_tmp = 0, lati_second_tmp = 0; - double long_cent_tmp = 0, long_second_tmp = 0; - float speed_tmp = 0; - char *buf = line; - uint8 return_state = 0; - - state = buf[get_parameter_index(2, buf)]; - - gps->state = 0; - if('A' == state) // 如果数据有效 则解析数据 - { - return_state = 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; // 纬度转换为度分秒 - lati_cent_tmp = (latitude - gps->latitude_degree * 100); - gps->latitude_cent = (int)lati_cent_tmp; - lati_second_tmp = (lati_cent_tmp - gps->latitude_cent) * 6000; - gps->latitude_second = (int)lati_second_tmp; - - gps->longitude_degree = (int)longitude / 100; // 经度转换为度分秒 - long_cent_tmp = (longitude - gps->longitude_degree * 100); - gps->longitude_cent = (int)long_cent_tmp; - long_second_tmp = (long_cent_tmp - gps->longitude_cent) * 6000; - gps->longitude_second = (int)long_second_tmp; - - gps->latitude = gps->latitude_degree + lati_cent_tmp / 60; - gps->longitude = gps->longitude_degree + long_cent_tmp / 60; - - speed_tmp = get_float_number(&buf[get_parameter_index(7, buf)]); // 速度(海里/小时) - gps->speed = speed_tmp * 1.85f; // 转换为公里/小时 - gps->direction = get_float_number(&buf[get_parameter_index(8, buf)]); // 角度 - } - - // 在定位没有生效前也是有时间数据的,可以直接解析 - gps->time.hour = (buf[7] - '0') * 10 + (buf[8] - '0'); // 时间 - 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'); // 日期 - 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_state; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 GGA语句解析 -// 参数说明 *line 接收到的语句信息 -// 参数说明 *gps 保存解析后的数据 -// 返回参数 uint8 1:解析成功 0:数据有问题不能解析 -// 使用示例 gps_gngga_parse((char *)data_buffer, &gps_tau1201); -// 备注信息 内部使用 -//------------------------------------------------------------------------------------------------------------------- -static uint8 gps_gngga_parse (char *line, gps_info_struct *gps) -{ - uint8 state = 0; - char *buf = line; - uint8 return_state = 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)]); // 高度 = 海拔高度 + 地球椭球面相对大地水准面的高度 - return_state = 1; - } - - return return_state; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 计算从第一个点到第二个点的距离 -// 参数说明 latitude1 第一个点的纬度 -// 参数说明 longitude1 第一个点的经度 -// 参数说明 latitude2 第二个点的纬度 -// 参数说明 longitude2 第二个点的经度 -// 返回参数 double 返回两点距离 -// 使用示例 get_two_points_distance(latitude1_1, longitude1, latitude2, longitude2); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -double get_two_points_distance (double latitude1, double longitude1, double latitude2, double longitude2) -{ - const double EARTH_RADIUS = 6378137; // 地球半径(单位:m) - double rad_latitude1 = 0; - double rad_latitude2 = 0; - double rad_longitude1 = 0; - double rad_longitude2 = 0; - double distance = 0; - double a = 0; - double b = 0; - - rad_latitude1 = ANGLE_TO_RAD(latitude1); // 根据角度计算弧度 - 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 里面实现的算法 - distance = distance * EARTH_RADIUS; - - return distance; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 计算从第一个点到第二个点的方位角 -// 参数说明 latitude1 第一个点的纬度 -// 参数说明 longitude1 第一个点的经度 -// 参数说明 latitude2 第二个点的纬度 -// 参数说明 longitude2 第二个点的经度 -// 返回参数 double 返回方位角(0至360) -// 使用示例 get_two_points_azimuth(latitude1_1, longitude1, latitude2, longitude2); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -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 ((0 < angle) ? angle : (angle + 360)); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 解析GPS数据 -// 参数说明 void -// 返回参数 uint8 0-解析成功 1-解析失败 可能数据包错误 -// 使用示例 gps_data_parse(); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -uint8 gps_data_parse (void) -{ - uint8 return_state = 0; - uint8 check_buffer[5] = {'0', 'x', 0x00, 0x00, 0x00}; - uint8 bbc_xor_origin = 0; - uint8 bbc_xor_calculation = 0; - uint32 data_len = 0; - - do - { - if(GPS_STATE_RECEIVED == gps_rmc_state) - { - gps_rmc_state = GPS_STATE_PARSING; - strncpy((char *)&check_buffer[2], strchr((const char *)gps_rmc_buffer, '*') + 1, 2); - bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); - for(bbc_xor_calculation = gps_rmc_buffer[1], data_len = 2; '*' != gps_rmc_buffer[data_len]; data_len ++) - { - bbc_xor_calculation ^= gps_rmc_buffer[data_len]; - } - if(bbc_xor_calculation != bbc_xor_origin) - { - // 数据校验失败 - return_state = 1; - break; - } - - gps_gnrmc_parse((char *)gps_rmc_buffer, &gps_tau1201); - } - gps_rmc_state = GPS_STATE_RECEIVING; - - if(GPS_STATE_RECEIVED == gps_gga_state) - { - gps_gga_state = GPS_STATE_PARSING; - strncpy((char *)&check_buffer[2], strchr((const char *)gps_gga_buffer, '*') + 1, 2); - bbc_xor_origin = (uint8)func_str_to_hex((char *)check_buffer); - - for(bbc_xor_calculation = gps_gga_buffer[1], data_len = 2; '*' != gps_gga_buffer[data_len]; data_len ++) - { - bbc_xor_calculation ^= gps_gga_buffer[data_len]; - } - if(bbc_xor_calculation != bbc_xor_origin) - { - // 数据校验失败 - return_state = 1; - break; - } - - gps_gngga_parse((char *)gps_gga_buffer, &gps_tau1201); - } - gps_gga_state = GPS_STATE_RECEIVING; - - }while(0); - return return_state; -} - - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 GPS串口回调函数 -// 参数说明 void -// 返回参数 void -// 使用示例 gps_uart_callback(); -// 备注信息 此函数需要在串口接收中断内进行调用 -//------------------------------------------------------------------------------------------------------------------- -void gps_uart_callback (void) -{ - uint8 temp_gps[6]; - uint32 temp_length = 0; - - if(gps_tau1201_state) - { - uint8 dat; - while(uart_query_byte(GPS_TAU1201_UART, &dat)) - { - fifo_write_buffer(&gps_tau1201_receiver_fifo, &dat, 1); - } - - if('\n' == dat) - { - // 读取前6个数据 用于判断语句类型 - temp_length = 6; - fifo_read_buffer(&gps_tau1201_receiver_fifo, temp_gps, &temp_length, FIFO_READ_ONLY); - - // 根据不同类型将数据拷贝到不同的缓冲区 - if(0 == strncmp((char *)&temp_gps[3], "RMC", 3)) - { - // 如果没有在解析数据则更新缓冲区的数据 - if(GPS_STATE_PARSING != gps_rmc_state) - { - gps_rmc_state = GPS_STATE_RECEIVED; - temp_length = fifo_used(&gps_tau1201_receiver_fifo); - fifo_read_buffer(&gps_tau1201_receiver_fifo, gps_rmc_buffer, &temp_length, FIFO_READ_AND_CLEAN); - } - } - else if(0 == strncmp((char *)&temp_gps[3], "GGA", 3)) - { - // 如果没有在解析数据则更新缓冲区的数据 - if(GPS_STATE_PARSING != gps_gga_state) - { - gps_gga_state = GPS_STATE_RECEIVED; - temp_length = fifo_used(&gps_tau1201_receiver_fifo); - fifo_read_buffer(&gps_tau1201_receiver_fifo, gps_gga_buffer, &temp_length, FIFO_READ_AND_CLEAN); - } - } - - // 统一将FIFO清空 - fifo_clear(&gps_tau1201_receiver_fifo); - - gps_tau1201_flag = 1; - } - } -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 GPS初始化 -// 参数说明 void -// 返回参数 void -// 使用示例 gps_init(); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -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}; - - fifo_init(&gps_tau1201_receiver_fifo, FIFO_DATA_8BIT, gps_tau1201_receiver_buffer, GPS_TAU1201_BUFFER_SIZE); - system_delay_ms(500); // 等待GPS启动后开始初始化 - uart_init(GPS_TAU1201_UART, 115200, GPS_TAU1201_RX, GPS_TAU1201_TX); - uart_rx_interrupt(GPS_TAU1201_UART, 0); - - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)set_rate, sizeof(set_rate)); // 设置GPS更新速率为10hz 如果不调用此语句则默认为1hz - system_delay_ms(200); - - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)open_rmc, sizeof(open_rmc)); // 开启rmc语句 - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)open_gga, sizeof(open_gga)); // 开启gga语句 - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gll, sizeof(close_gll)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gsa, sizeof(close_gsa)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_grs, sizeof(close_grs)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gsv, sizeof(close_gsv)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_vtg, sizeof(close_vtg)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_zda, sizeof(close_zda)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_gst, sizeof(close_gst)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_txt, sizeof(close_txt)); - system_delay_ms(50); - uart_write_buffer(GPS_TAU1201_UART, (uint8 *)close_txt_ant, sizeof(close_txt_ant)); - system_delay_ms(50); - - gps_tau1201_state = 1; - uart_rx_interrupt(GPS_TAU1201_UART, 1); -} diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_gps_tau1201.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_gps_tau1201.h deleted file mode 100644 index c167bae..0000000 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_gps_tau1201.h +++ /dev/null @@ -1,117 +0,0 @@ -/********************************************************************************************************************* -* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库 -* Copyright (c) 2022 SEEKFREE 逐飞科技 -* -* 本文件是 TC264 开源库的一部分 -* -* TC264 开源库 是免费软件 -* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款 -* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 -* -* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 -* 甚至没有隐含的适销性或适合特定用途的保证 -* 更多细节请参见 GPL -* -* 您应该在收到本开源库的同时收到一份 GPL 的副本 -* 如果没有,请参阅 -* -* 额外注明: -* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 -* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 -* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 -* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) -* -* 文件名称 zf_device_gps_tau1201 -* 公司名称 成都逐飞科技有限公司 -* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 -* 适用平台 TC264D -* 店铺链接 https://seekfree.taobao.com/ -* -* 修改记录 -* 日期 作者 备注 -* 2022-09-15 pudding first version -* 2023-04-28 pudding 增加中文注释说明 -********************************************************************************************************************/ -/******************************************************************************************************************** -* 接线定义: -* ------------------------------------ -* 模块管脚 单片机管脚 -* RX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_RX 宏定义 -* TX 查看 zf_device_gps_tau1201.h 中 GPS_TAU1201_TX 宏定义 -* VCC 3.3V电源 -* GND 电源地 -* ------------------------------------ -********************************************************************************************************************/ - -#ifndef _zf_device_gps_tau1201_h_ -#define _zf_device_gps_tau1201_h_ - -#include "zf_common_typedef.h" - -//=================================================定义 定位模块 基本配置================================================ -#define GPS_TAU1201_UART (UART_3) -#define GPS_TAU1201_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 -#define GPS_TAU1201_TX (UART3_RX_P15_7) // GPS TX串口引脚 - -#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 -#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 -#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; // 时间- - uint8 state; // 有效状态 1:定位有效 0:定位无效 - uint16 latitude_degree; // 度 - uint16 latitude_cent; // 分 - uint16 latitude_second; // 秒 - uint16 longitude_degree; // 度 - uint16 longitude_cent; // 分 - uint16 longitude_second; // 秒 - double latitude; // 纬度 - double longitude; // 经度 - int8 ns; // 纬度半球 N(北半球)或 S(南半球) - int8 ew; // 经度半球 E(东经)或 W(西经) - float speed; // 速度(公里/每小时) - float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) - // 下面两个个信息从GNGGA语句中获取 - uint8 satellite_used; // 用于定位的卫星数量 - float height; // 高度 -}gps_info_struct; - -typedef enum -{ - GPS_STATE_RECEIVING, // 正在接收数据 - GPS_STATE_RECEIVED, // 数据接收完成 - GPS_STATE_PARSING, // 正在解析 -}gps_state_enum; -//================================================定义 定位模块 参数结构体================================================ - - -//=================================================声明 定位模块 全局变量================================================ -extern gps_info_struct gps_tau1201; // GPS解析之后的数据 -extern uint8 gps_tau1201_flag; // 1:采集完成等待处理数据 0:没有采集完成 -//=================================================声明 定位模块 全局变量================================================ - - -//=================================================声明 定位模块 基础函数================================================ -double get_two_points_distance (double lat1, double lng1, double lat2, double lng2); // 计算从第一个点到第二个点的距离(单位:m) -double get_two_points_azimuth (double lat1, double lon1, double lat2, double lon2); // 计算从第一个点到第二个点的方位角(单位:°) -uint8 gps_data_parse (void); // 解析GPS数据 -void gps_uart_callback (void); // GPS回调函数 -void gps_init (void); // GPS初始化 -//=================================================声明 定位模块 基础函数================================================ -#endif diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_icm20602.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_icm20602.c index f4ae830..ddebf3c 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_icm20602.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_icm20602.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_icm20602 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_icm20602.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_icm20602.h index 67724ad..209972b 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_icm20602.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_icm20602.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_icm20602 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_imu660ra.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_imu660ra.c index 95144f9..02fdb9e 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_imu660ra.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_imu660ra.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu660ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_imu660ra.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_imu660ra.h index a689df1..348e6a1 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_imu660ra.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_imu660ra.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu660ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_imu963ra.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_imu963ra.c index 92ec0f6..595142a 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_imu963ra.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_imu963ra.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu963ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_imu963ra.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_imu963ra.h index 4d0d9f9..c0f981f 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_imu963ra.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_imu963ra.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_imu963ra * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ips114.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ips114.c index 78c6f3b..b13e338 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ips114.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ips114.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips114 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ips114.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ips114.h index 81dfc3c..ba932b1 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ips114.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ips114.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips114 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ips200.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ips200.c index cd8681f..37d9d04 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ips200.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ips200.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips200 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ips200.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ips200.h index ce59927..045bf27 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ips200.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ips200.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ips200 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_key.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_key.c index 9e42c8a..8b240cb 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_key.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_key.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_key * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_key.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_key.h index bcab8aa..9c653cf 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_key.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_key.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_key * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_mpu6050.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_mpu6050.c index dc3c5b2..101a5ae 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_mpu6050.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_mpu6050.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_mpu6050 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_mpu6050.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_mpu6050.h index 3510e06..c8a086f 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_mpu6050.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_mpu6050.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_mpu6050 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_mt9v03x.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_mt9v03x.c index 231cfec..d38b8df 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_mt9v03x.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_mt9v03x.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_mt9v03x * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_mt9v03x.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_mt9v03x.h index 7786bc5..9d4650d 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_mt9v03x.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_mt9v03x.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_mt9v03x * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_oled.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_oled.c index 5314209..55aefa7 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_oled.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_oled.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_oled * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_oled.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_oled.h index d52d2fd..aadf048 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_oled.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_oled.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_oled * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ov7725.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ov7725.c index 12f6095..bac95fe 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ov7725.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ov7725.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_ov7725 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ov7725.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ov7725.h index f45a4e8..2cb4026 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ov7725.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ov7725.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_ov7725 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_scc8660.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_scc8660.c index 3483c93..38d65ff 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_scc8660.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_scc8660.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_scc8660 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_scc8660.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_scc8660.h index 815d272..537283a 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_scc8660.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_scc8660.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_scc8660 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_tft180.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_tft180.c index db50824..b661e91 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_tft180.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_tft180.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_tft180 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_tft180.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_tft180.h index 47491ee..54a72b3 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_tft180.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_tft180.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_tft180 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_tsl1401.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_tsl1401.c index 3f9db7f..d133c7c 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_tsl1401.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_tsl1401.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_tsl1401 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_tsl1401.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_tsl1401.h index 1fab12e..a7b061c 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_tsl1401.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_tsl1401.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_tsl1401 * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_type.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_type.c index 497ba55..af24701 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_type.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_type.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_type * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -32,6 +32,7 @@ * 日期 作者 备注 * 2022-09-15 pudding first version * 2023-05-26 pudding 新增SPI WIFI 中断回调指针 +* 2024-01-16 pudding 移除SPI WIFI 中断回调指针 SPI WIFI将不再使用外部 ********************************************************************************************************************/ #include "zf_device_type.h" @@ -45,7 +46,6 @@ callback_function camera_dma_handler = type_default_callback; wireless_type_enum wireless_type = NO_WIRELESS; callback_function wireless_module_uart_handler = type_default_callback; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 -callback_function wireless_module_spi_handler = type_default_callback; // WIFI SPI GPIO中断函数指针,根据初始化时设置的函数进行跳转 tof_type_enum tof_type = NO_TOF; callback_function tof_module_exti_handler = type_default_callback; // ToF 模块 INT 更新中断 @@ -54,7 +54,7 @@ callback_function tof_module_exti_handler = type_default_callback; // 函数简介 默认回调函数 // 参数说明 void // 返回参数 void -// 使用示例 +// 使用示例 // 备注信息 保护性冗余设计 防止在没有初始化设备的时候跑飞 //------------------------------------------------------------------------------------------------------------------- static void type_default_callback (void) @@ -90,14 +90,7 @@ void set_camera_type (camera_type_enum type_set, callback_function vsync_callba void set_wireless_type (wireless_type_enum type_set, callback_function wireless_callback) { wireless_type = type_set; - if(WIFI_SPI == wireless_type) - { - wireless_module_spi_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); - } - else - { - wireless_module_uart_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); - } + wireless_module_uart_handler = ((wireless_callback == NULL) ? (type_default_callback) : (wireless_callback)); } //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_type.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_type.h index 19c36ca..3b124fe 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_type.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_type.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_type * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -56,7 +56,6 @@ typedef enum WIRELESS_UART, // 无线串口 BLUETOOTH_CH9141, // 蓝牙 CH9141 WIFI_UART, // 串口 WiFi - WIFI_SPI // SPI WiFi }wireless_type_enum; typedef enum diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c index 2bdb164..3cbc786 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_virtual_oscilloscope * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h index f518026..b0fd085 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_virtual_oscilloscope * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_wifi_spi.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_wifi_spi.c index 78a6d68..f9e51ca 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_wifi_spi.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_wifi_spi.c @@ -24,14 +24,13 @@ * 文件名称 zf_device_wifi_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 * 日期 作者 备注 -* 2023-05-27 pudding first version -* 2023-05-29 pudding 新增关闭休眠指令,提升通讯效率 +* 2022-09-21 SeekFree first version ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,1374 +52,615 @@ #include "zf_common_clock.h" #include "zf_common_debug.h" #include "zf_common_fifo.h" -#include "zf_common_function.h" #include "zf_driver_delay.h" #include "zf_driver_gpio.h" -#include "zf_common_interrupt.h" -#include "zf_driver_exti.h" #include "zf_driver_spi.h" #include "zf_device_type.h" #include "zf_device_wifi_spi.h" -#define WAIT_TIME_OUT (10000) // 单指令等待时间 单位:ms +#define WIFI_CONNECT_TIME_OUT 10000 // 单位毫秒 +#define SOCKET_CONNECT_TIME_OUT 50000 // 单位毫秒 +#define OTHER_TIME_OUT 1000 // 单位毫秒 -#define WIFI_SPI_WRITE_MAX 128 // 定义一次SPI通讯最大发送的数据长度 - -#define WIFI_SPI_WRITE_REQUEST 0x01 -#define WIFI_SPI_CHECK_STATE 0x02 -#define WIFI_SPI_WRITE_DATA 0x03 -#define WIFI_SPI_READ_DATA 0x04 -#define WIFI_SPI_WRITE_END 0x07 -#define WIFI_SPI_READ_END 0x08 - -#define WIFI_SPI_WRITE_ADDR 0x00 -#define WIFI_SPI_STATE_ADDR 0x04 +char wifi_spi_version[12]; // 保存模块固件版本信息 +char wifi_spi_mac_addr[20]; // 保存模块MAC地址信息 +char wifi_spi_ip_addr_port[25]; // 保存模块IP地址与端口信息 -volatile wifi_spi_buffer_state_enum wifi_buffer_state; -volatile wifi_spi_transmit_state_enum wifi_transmit_state; - -static fifo_obj_struct wifi_spi_fifo; -static uint8 wifi_spi_buffer[WIFI_SPI_BUFFER_SIZE]; // 数据存放数组 - -vuint8 wifi_spi_ack_flag = 0; // 0:模块未应答 1:模块已应答 -uint8 wifi_spi_init_flag; // 0:模块未初始化成功或者未连接 1:模块已连接并成功初始化 -vuint8 wifi_spi_packet_num; // 发送的数据包ID -vuint32 wifi_spi_send_remain_length; // 剩余的发送长度 - - - -wifi_spi_information_struct wifi_spi_information; +static fifo_struct wifi_spi_fifo; +static uint8 wifi_spi_buffer[WIFI_SPI_RECVIVE_FIFO_SIZE]; +static volatile wifi_spi_state_enum wifi_spi_mutex; //------------------------------------------------------------------------------------------------------------------- -// 函数简介 请求写入数据到模块 -// 参数说明 length 需要写入的长度 -// @return void -// Sample usage: +// 函数简介 等待WIFI SPI就绪 +// 参数说明 wait_time 最大等待时间 单位毫秒 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_write_request(uint16 length) +static uint8 wifi_spi_wait_idle (uint32 wait_time) { - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_REQUEST; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - head.magic = 0xFE; - head.sequence = wifi_spi_packet_num++; - head.length = length; + uint32 time = 0; - wifi_transmit_state = TRANSMIT_WRITE_REQUEST; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 7); - gpio_set_level(WIFI_SPI_CS_PIN, 1); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 读取模块状态 -// 参数说明 *length 需要读取或者写入的长度 -// @return WIFI_SPI_BUFFER_STATE_enum 模块状态 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static wifi_spi_buffer_state_enum wifi_spi_read_state(uint16 *length) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_CHECK_STATE; - head.addr = WIFI_SPI_STATE_ADDR; - head.dummy = 0x00; - - wifi_spi_ack_flag = 0; - wifi_transmit_state = TRANSMIT_READ_STATE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_transfer_8bit(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, &head.cmd, 7); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - - if(BUFFER_WRITE == head.magic) + wait_time = wait_time*100; + while(0 == gpio_get_level(WIFI_SPI_INT_PIN)) { - wifi_spi_packet_num = head.sequence; - } - *length = head.length; - - return (wifi_spi_buffer_state_enum)head.magic; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据发送完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_done(void) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_END; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_transmit_state = TRANSMIT_IDLE; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据接收完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_start(void) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_READ_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - wifi_transmit_state = TRANSMIT_READ; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 数据接收完成 -// 参数说明 void -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_done(void) -{ - wifi_spi_buffer_struct head; - - gpio_set_level(WIFI_SPI_CS_PIN, 1); - - head.cmd = WIFI_SPI_READ_END; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_transmit_state = TRANSMIT_IDLE; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块 -// 参数说明 *buff 需要写入数据的首地址 -// 参数说明 length 需要写入数据的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_data(const uint8 *buff, uint16 length) -{ - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - wifi_transmit_state = TRANSMIT_WRITE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - spi_write_8bit_array(WIFI_SPI_INDEX, buff, length); - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_spi_send_done(); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_data_multi(wifi_spi_send_multi_struct *multi_buffer) -{ - uint8 i; - wifi_spi_buffer_struct head; - - head.cmd = WIFI_SPI_WRITE_DATA; - head.addr = WIFI_SPI_WRITE_ADDR; - head.dummy = 0x00; - - wifi_transmit_state = TRANSMIT_WRITE; - gpio_set_level(WIFI_SPI_CS_PIN, 0); - spi_write_8bit_array(WIFI_SPI_INDEX, (const uint8 *)&head.cmd, 3); - - for(i = 0; i < WIFI_SPI_MAX_MULTI; i++) - { - if(NULL != multi_buffer->source[i]) spi_write_8bit_array(WIFI_SPI_INDEX, multi_buffer->source[i], multi_buffer->length[i]); - } - gpio_set_level(WIFI_SPI_CS_PIN, 1); - wifi_spi_send_done(); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 接收模块发送的数据 -// 参数说明 *buff 接收数组的缓冲区首地址 -// 参数说明 length 需要接收的长度 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_receive_data(uint8 *buff, uint16 length) -{ - spi_read_8bit_array(WIFI_SPI_INDEX, buff, length); -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送命令到模块 -// 参数说明 *str 命令字符串首地址 -// @return void -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -static void wifi_spi_send_command(const char *str) -{ - uint8 state = 0; - uint16 send_length; - uint16 wait_time = 0; - - // 请求发送数据 - send_length = (uint16)strlen(str); - - // 等待传输进入空闲 - while(TRANSMIT_IDLE != wifi_transmit_state); - - // 如果没有进入发送状态则重新请求发送数据 - while(BUFFER_WRITE != wifi_buffer_state) - { - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - while(!wifi_spi_ack_flag) - { - wait_time++; - if((WAIT_TIME_OUT / 4) <= wait_time) - { - state = 1; - wifi_spi_init_flag = 0; // 模块已断开 - break; - } - system_delay_ms(1); - } - - if(1 == state) + system_delay_us(10); + time++; + if(wait_time <= time) { break; } } - - wifi_buffer_state = BUFFER_IDLE; - - if(0 == state) // 通讯未超时 - { - wifi_spi_send_remain_length = send_length; - // 发送消息 - wifi_spi_send_data((const uint8 *)str, send_length); - } + return (wait_time <= time); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 检查模块状态并读取模块发送的数据 -// 参数说明 void -// @return void -// Sample usage: +// 函数简介 写入数据到WIFI SPI +// 参数说明 *buffer1 第一组需要发送的数据缓冲区地址 +// 参数说明 length1 第一组数据长度 +// 参数说明 *buffer2 第二组需要发送的数据缓冲区地址 +// 参数说明 length2 第二组数据长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -void wifi_spi_check_state_read_buffer(void) +static void wifi_spi_write (const uint8 *buffer1, uint16 length1, const uint8 *buffer2, uint16 length2) { - uint16 wifi_spi_receive_length; // 本次接收到的数据数量 - uint8 wifi_spi_receive_buffer[WIFI_SPI_WRITE_MAX]; - - // 查询WIFI模块的状态 - wifi_buffer_state = wifi_spi_read_state(&wifi_spi_receive_length); - - // 如果需要读取WIFI模块数据,则保存需要读取的长度 - if(BUFFER_READ == wifi_buffer_state) + gpio_low(WIFI_SPI_CS_PIN); + if(NULL != buffer1) { - wifi_spi_receive_start(); - do - { - if(wifi_spi_receive_length > WIFI_SPI_WRITE_MAX) - { - wifi_spi_receive_data((uint8 *)wifi_spi_receive_buffer, WIFI_SPI_WRITE_MAX); - fifo_write_buffer(&wifi_spi_fifo, wifi_spi_receive_buffer, WIFI_SPI_WRITE_MAX); // 存入 FIFO - wifi_spi_receive_length = wifi_spi_receive_length - WIFI_SPI_WRITE_MAX; - } - else - { - wifi_spi_receive_data((uint8 *)wifi_spi_receive_buffer, wifi_spi_receive_length); - fifo_write_buffer(&wifi_spi_fifo, wifi_spi_receive_buffer, wifi_spi_receive_length); // 存入 FIFO - wifi_spi_receive_length = 0; - } - }while(wifi_spi_receive_length > 0); - wifi_spi_receive_done(); + spi_write_8bit_array(WIFI_SPI_INDEX, buffer1, length1); } - else if(BUFFER_IDLE == wifi_buffer_state) + if(NULL != buffer2) { - // 如果模块内部缓冲区状态为空闲,则传输状态也设置为空闲 - wifi_transmit_state = TRANSMIT_IDLE; + spi_write_8bit_array(WIFI_SPI_INDEX, buffer2, length2); } + gpio_high(WIFI_SPI_CS_PIN); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块 -// 参数说明 *buff 需要发送的数据首地址 -// 参数说明 length 需要发送的长度 -// @return uint32 剩余未发送长度 -// Sample usage: +// 函数简介 WIFI SPI 发送与接收同时进行(命令收发) +// 参数说明 *packets 发送与接收的地址 +// 参数说明 length 需要接收的长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_write_data(const uint8 *buff, uint32 length) +static void wifi_spi_transfer_command (wifi_spi_packets_struct *packets, uint16 length) { - uint16 send_length; - uint32 wait_time; + gpio_low(WIFI_SPI_CS_PIN); - // 记录需要发送的长度 - wifi_spi_send_remain_length = length; - - while(wifi_spi_send_remain_length) + spi_transfer_8bit(WIFI_SPI_INDEX, (uint8 *)&(packets->head), (uint8 *)&(packets->head), sizeof(wifi_spi_head_struct)); + + if(length) { - send_length = (uint16)func_limit_ab(wifi_spi_send_remain_length, 1, WIFI_SPI_WRITE_MAX); - - // 请求发送数据 - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - - // 最长等待5秒 - wait_time = 5000; - while(!wifi_spi_ack_flag) - { - wait_time--; - if(0 == wait_time) break; - system_delay_ms(1); - } - - if(BUFFER_WRITE == wifi_buffer_state) - { - // 发送消息 - wifi_spi_send_data(buff, send_length); - buff += send_length; - wifi_spi_send_remain_length -= send_length; - wifi_buffer_state = BUFFER_IDLE; - } - else - { - break; - } + spi_transfer_8bit(WIFI_SPI_INDEX, (const uint8 *)(packets->buffer), packets->buffer, length); } - - return wifi_spi_send_remain_length; + + gpio_high(WIFI_SPI_CS_PIN); } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 发送数据到模块(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// @return uint32 剩余未发送长度 -// Sample usage: 发送数据总长度不能超过4092个 +// 函数简介 WIFI SPI 发送与接收同时进行(数据收发) +// 参数说明 *write_data 发送的数据缓冲区地址 +// 参数说明 *read_data 接收到的数据的存储地址 +// 参数说明 length 需要接收的长度 +// 返回参数 void +// 使用示例 内部使用,用户无需关心 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_write_data_multi(wifi_spi_send_multi_struct *multi_buffer) +static void wifi_spi_transfer_data (const uint8 *write_data, wifi_spi_packets_struct *read_data, uint16 length) { - uint16 send_length; - uint32 wait_time; + gpio_low(WIFI_SPI_CS_PIN); - // 记录需要发送的长度 - send_length = multi_buffer->length[0] + multi_buffer->length[1] + multi_buffer->length[2] + multi_buffer->length[3] + multi_buffer->length[4] + multi_buffer->length[5] + multi_buffer->length[6] + multi_buffer->length[7]; + read_data->head.command = WIFI_SPI_DATA; + read_data->head.length = length; - if(WIFI_SPI_WRITE_MAX >= send_length) + spi_transfer_8bit(WIFI_SPI_INDEX, (uint8 *)&(read_data->head), (uint8 *)&(read_data->head), sizeof(wifi_spi_head_struct)); + + if(WIFI_SPI_RECVIVE_SIZE < length) { - // 请求发送数据 - wifi_spi_ack_flag = 0; - wifi_spi_write_request(send_length); - - // 最长等待5秒 - wait_time = 5000; - while(!wifi_spi_ack_flag) - { - wait_time--; - if(0 == wait_time) break; - system_delay_ms(1); - } - - if(BUFFER_WRITE == wifi_buffer_state) - { - // 发送消息 - wifi_spi_send_data_multi(multi_buffer); - send_length = 0; - wifi_buffer_state = BUFFER_IDLE; - } + spi_transfer_8bit(WIFI_SPI_INDEX, write_data, read_data->buffer, WIFI_SPI_RECVIVE_SIZE); + spi_write_8bit_array(WIFI_SPI_INDEX, &write_data[WIFI_SPI_RECVIVE_SIZE], length - WIFI_SPI_RECVIVE_SIZE); } - - return send_length; + else + { + // 将需要发送的数据拷贝到读取缓冲区,避免出现write_data越界访问 + memcpy(read_data->buffer, write_data, length); + spi_transfer_8bit(WIFI_SPI_INDEX, read_data->buffer, read_data->buffer, WIFI_SPI_RECVIVE_SIZE); + } + gpio_high(WIFI_SPI_CS_PIN); } -//-------------------------------------------------------------------------------------------------- -// 函数简介 等待模块响应 -// 参数说明 *wait_buffer 等待的响应的字符串 -// 参数说明 timeout 超时时间 -// 返回参数 uint8 0:模块响应指定数据 1:模块未响应指定数据或超时 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_wait_ack (char *wait_buffer, uint32 timeout) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 参数设置 +// 参数说明 command 命令类型 +// 参数说明 *buffer 参数地址 +// 参数说明 length 参数长度 +// 参数说明 wait_time 最大等待时间 单位100微妙 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_set_parameter (wifi_spi_packets_command_enum command, uint8 *buffer, uint16 length, uint32 wait_time) { - uint8 return_state = 1; - char receiver_buffer[8] = {0, 0, 0, 0, 0, 0, 0, 0}; - uint32 receiver_len = 8; - + uint8 return_state; + wifi_spi_head_struct head; + return_state = 1; do { - system_delay_ms(1); - // 判断接收缓冲区内是否有需要响应的指定数据 如果有 则跳出循环并且返回0 - receiver_len = 8; - fifo_read_tail_buffer(&wifi_spi_fifo, (uint8 *)receiver_buffer, &receiver_len, FIFO_READ_ONLY); + head.command = command; + head.length = length; + + // 等待从机准备就绪 + if(wifi_spi_wait_idle(wait_time)) + { + break; + } - if(strstr(receiver_buffer, wait_buffer)) + wifi_spi_write(&head.command, sizeof(wifi_spi_head_struct), buffer, length); + if(wifi_spi_wait_idle(wait_time)) + { + break; + } + // 接收应答信号 + + head.command = WIFI_SPI_DATA; + head.length = 0; + wifi_spi_transfer_command((wifi_spi_packets_struct *)&head, head.length); + system_delay_us(20); + if(WIFI_SPI_REPLY_OK == head.command) { return_state = 0; - break; } - else if(strstr(receiver_buffer, "ERROR") || strstr(receiver_buffer, "busy")) - { - // 如果接收到报错或者模块忙 则跳出循环并且返回1 - return_state = 1; - break; - } - }while(timeout --); + }while(0); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 清除WiFi接收缓冲区内容 -// 参数说明 void -// 返回参数 void -// 使用示例 wifi_spi_clear_receive_buffer(); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static void wifi_spi_clear_receive_buffer (void) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 模块信息获取 +// 参数说明 command 命令类型 +// 参数说明 *buffer 保存接收到的参数地址 +// 参数说明 wait_time 最大等待时间 单位100微妙 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 内部使用,用户无需关心 +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_parameter (wifi_spi_packets_command_enum command, wifi_spi_packets_struct *read_data, uint32 wait_time) { - // 清空WiFi接收缓冲区 - fifo_clear(&wifi_spi_fifo); -} + uint8 return_state; -//-------------------------------------------------------------------------------------------------- -// 函数简介 模块数据解析 -// 参数说明 *target_buffer 目标存放地址指针 字符串数组 -// 参数说明 *origin_buffer 数据来源地址指针 字符串数组 -// 参数说明 start_char 起始提取字节 例如从 "1234" 中从 '2' 开始提取 就应该填入 '2' -// 参数说明 end_char 结束提取字节 例如从 "1234" 中在 '4' 结束提取 就应该填入 '\0'(0x00 空字符 一般是字符串结尾) -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_data_parse(wifi_spi_information.mac, wifi_spi_receive_buffer, '"', '"'); // 调用获取本机mac地址后,调用此函数提取mac地址 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char start_char, char end_char) -{ - uint8 return_state = 0; - char *location1; - char *location2; - location1 = strchr((char *)origin_buffer, start_char); - if(location1) + return_state = 1; + do { - location1 ++; - location2 = strchr(location1, end_char); - if(location2) + // 等待从机准备就绪 + if(wifi_spi_wait_idle(wait_time)) { - memcpy(target_buffer, location1, location2-location1); + break; } - else + read_data->head.command = command; + wifi_spi_write(&(read_data->head.command), WIFI_SPI_RECVIVE_SIZE, NULL, 0); + + if(wifi_spi_wait_idle(wait_time)) { - return_state = 1; + break; } - } - else - { - return_state = 1; - } + read_data->head.command = WIFI_SPI_DATA; + read_data->head.length = 0; + wifi_spi_transfer_command(read_data, WIFI_SPI_RECVIVE_SIZE); + return_state = 0; + }while(0); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 查看模块版本信息 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_get_version(); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 固件版本获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,固件版本信息以字符串形式保存在wifi_spi_version数组中 +//------------------------------------------------------------------------------------------------------------------- static uint8 wifi_spi_get_version (void) { - char *location1; - uint8 return_state = 0; - uint8 receiver_buffer[256]; - uint32 receiver_len = 256; + uint8 return_state; + wifi_spi_packets_struct temp_packets; - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+GMR\r\n"); - do + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_VERSION, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_VERSION == temp_packets.head.command)) { - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - location1 = strrchr((char *)receiver_buffer, ':'); - if(wifi_spi_data_parse(wifi_spi_information.version, (uint8 *)location1, ':', '(')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - + memcpy(wifi_spi_version, temp_packets.buffer, temp_packets.head.length); + } return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 模块回显设置 -// 参数说明 model 0:关闭模块的回写功能 其他:开启模块回写 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_echo_set("1");//开启模块回写功能 -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_echo_set (char *model) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI MAC地址获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,MAC地址信息以字符串形式保存在wifi_spi_mac_addr数组中 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_mac_addr (void) { - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - if('1' == *model) + uint8 return_state; + wifi_spi_packets_struct temp_packets; + + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_MAC_ADDR, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_MAC_ADDR == temp_packets.head.command)) { - wifi_spi_send_command("ATE1\r\n"); + memcpy(wifi_spi_mac_addr, temp_packets.buffer, temp_packets.head.length); + } + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI IP地址与端口号获取 +// 参数说明 void 端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 调用函数之后,IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 +// 需要在连接Socket之后调用此函数才能正常获取信息 +//------------------------------------------------------------------------------------------------------------------- +static uint8 wifi_spi_get_ip_addr_port (void) +{ + uint8 return_state; + wifi_spi_packets_struct temp_packets; + + return_state = wifi_spi_get_parameter(WIFI_SPI_GET_IP_ADDR, &temp_packets, OTHER_TIME_OUT); + if((0 == return_state) && (WIFI_SPI_REPLY_IP_ADDR == temp_packets.head.command)) + { + memcpy(wifi_spi_ip_addr_port, temp_packets.buffer, temp_packets.head.length); + } + return return_state; +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 设置连接的WiFi信息并尝试连接WiFi +// 参数说明 *wifi_ssid WIFI名称 +// 参数说明 *pass_word WIFI密码 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_wifi_connect("SEEKFREE", "SEEKFREE123"); +// 备注信息 wifi_spi_wifi_connect("SEEKFREE", NULL); // 连接没有密码的WIFI热点 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_wifi_connect (char *wifi_ssid, char *pass_word) +{ + uint8 return_state; + uint8 temp_buffer[64]; + uint16 length; + + if(NULL != pass_word) + { + // WIFI热点有密码发送热点名称与密码 + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n%s\r\n", wifi_ssid, pass_word); } else { - wifi_spi_send_command("ATE0\r\n"); + // WIFI热点没有密码只需要发送热点名称 + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n", wifi_ssid); } - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + return_state = wifi_spi_set_parameter(WIFI_SPI_SET_WIFI_INFORMATION, temp_buffer, length, WIFI_CONNECT_TIME_OUT); + + // 本机IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 + wifi_spi_get_ip_addr_port(); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块自身 的 MAC 地址 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_mac()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_mac (void) -{ - uint8 return_state = 0; - uint8 receiver_buffer[64]; - uint32 receiver_len = 64; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPAPMAC?\r\n"); - do - { - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - if(wifi_spi_data_parse(wifi_spi_information.mac, receiver_buffer, '"', '"')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块或者目标WIFI 的 IP 地址(取决于模块当前的工作模式) -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_ip()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_ip (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_STATION == wifi_spi_information.mode) - { - wifi_spi_send_command("AT+CIPSTA?\r\n"); - } - else if(WIFI_SPI_SOFTAP == wifi_spi_information.mode) - { - wifi_spi_send_command("AT+CIPAP?\r\n"); - } - - do - { - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - uint8 receiver_buffer[128]; - uint32 receiver_len = 128; - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - if(wifi_spi_data_parse(wifi_spi_information.local_ip, receiver_buffer, '"', '"')) - { - return_state = 1; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 查询模块的相关信息 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 if(wifi_spi_get_information()){} -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_get_information (void) -{ - uint8 return_state = 0; - do - { - // 获取模块版本号 - if(wifi_spi_get_version()) - { - return_state = 1; - break; - } - // 获取模块IP地址 - if(wifi_spi_get_ip()) - { - return_state = 1; - break; - } - // 获取模块MAC信息 - if(wifi_spi_get_mac()) - { - return_state = 1; - break; - } - memcpy(wifi_spi_information.local_port, "no port", 7); - }while(0); - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 连接 WiFi -// 参数说明 wifi_ssid WiFi名称 -// 参数说明 pass_word WiFi密码 -// 参数说明 model 0:查询WiFi连接情况 其他:连接WiFi -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_get_or_connect_wifi("WiFi_name", "Pass_word", 1); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_wifi (char *wifi_ssid, char *pass_word) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SOFTAP == wifi_spi_information.mode) - { - sprintf(temp, "AT+CWSAP=\"%s\",\"%s\",5,3\r\n", wifi_ssid, pass_word); - wifi_spi_send_command(temp); - } - else - { - sprintf(temp, "AT+CWJAP=\"%s\",\"%s\"\r\n", wifi_ssid, pass_word); - wifi_spi_send_command(temp); - } - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 上电是否自动连接WiFi -// 参数说明 model 0:上电不自动连接wifi 其他:上电自动连接wifi -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_auto_connect_wifi(0); //上电不自动连接wifi -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_auto_connect_wifi (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CWAUTOCONN=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置连接模式 -// 参数说明 model 0: 单连接模式 1:多连接模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_connect_model("1"); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_connect_model (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPMUX=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置传输模式 -// 参数说明 model – 0: 普通传输模式 IP断开后不重新连接 -// – 1: Wi-Fi 透传接收模式,仅支持 TCP 单连接、UDP 固定通信对端、SSL 单连接的情况 IP断开后会不断尝试重新连接 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_transfer_model("1"); -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -static uint8 wifi_spi_set_transfer_model (char *model) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPMODE=%s\r\n", model); - wifi_spi_send_command(temp); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 设置模块模式 (Station/SoftAP/Station+SoftAP) -// 参数说明 state 0:无 Wi-Fi 模式,并且关闭 Wi-Fi RF----1: Station 模式----2: SoftAP 模式----3: SoftAP+Station 模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_set_model("1"); +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 设置连接的Socket信息并尝试连接Socket +// 参数说明 *transport_type 传输类型 +// 参数说明 *ip_addr IP地址 +// 参数说明 *port 目标端口号 +// 参数说明 *local_port 本机端口号 +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_socket_connect("TCP", "192.168.2.5", "8080", "6060"); // 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_set_model (wifi_spi_mode_enum mode) +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_socket_connect (char *transport_type, char *ip_addr, char *port, char *local_port) { - uint8 return_state = 0; + uint8 return_state; + uint8 temp_buffer[41]; + uint16 length; + + length = (uint16)sprintf((char *)temp_buffer, "%s\r\n%s\r\n%s\r\n%s\r\n", transport_type, ip_addr, port, local_port); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + return_state = wifi_spi_set_parameter(WIFI_SPI_SET_SOCKET_INFORMATION, temp_buffer, length, SOCKET_CONNECT_TIME_OUT); - if(WIFI_SPI_SOFTAP == mode) - { - wifi_spi_send_command("AT+CWMODE=2\r\n"); - } - else - { - wifi_spi_send_command("AT+CWMODE=1\r\n"); - } - // 设置模块工作模式 - wifi_spi_information.mode = mode; - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + // 本机IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中 + wifi_spi_get_ip_addr_port(); return return_state; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 关闭睡眠模式 -// 参数说明 mode -// 返回参数 uint8 0:成功 1:失败 +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 断开Socket连接 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 wifi_spi_socket_disconnect(); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_socket_disconnect (void) +{ + wifi_spi_packets_struct temp_packets; + + return wifi_spi_get_parameter(WIFI_SPI_CLOSE_SOCKET, &temp_packets, OTHER_TIME_OUT); +} + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 软复位 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 // 使用示例 // 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_close_sleep_model (void) +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_reset (void) { - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+SLEEP=0\r\n"); - // 设置模块工作模式 - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 断开与wifi的连接 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_disconnected_wifi(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_disconnected_wifi (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CWQAP\r\n"); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 进入打开透传模式 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_entry_serianet(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_entry_serianet (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPSEND\r\n"); - return_state = wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 退出透传模式 -// 参数说明 model 0:关闭透传模式 其他:开启透传模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_exit_serianet(1); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_exit_serianet (void) -{ - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - system_delay_ms(20); - wifi_spi_send_command("+++"); - system_delay_ms(1000); - - return 0; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 建立TCP连接 -// 参数说明 ip 远端 IPv4 地址、IPv6 地址,或域名 -// 参数说明 port 远端端口值 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_connect_tcp_servers("192.168.101.110", "8080"); -// 备注信息 如果总是连接不上电脑的TCP服务器 可以尝试使用网线连接电脑 -// 如果是使用WiFi连接 可能会导致模块连接TCP服务器等待较长时间 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_connect_tcp_servers (char *ip, char *port, wifi_spi_transfer_mode_enum mode) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + uint8 return_state; + wifi_spi_head_struct head; + return_state = 1; do { - if(wifi_spi_set_connect_model("0")) + head.command = WIFI_SPI_RESET; + head.length = 0xA5A5; + return_state = wifi_spi_wait_idle(OTHER_TIME_OUT); + if(return_state) { - return_state = 1; break; } + wifi_spi_write(&head.command, sizeof(wifi_spi_head_struct), NULL, 0); + }while(0); + + return return_state; +} - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - sprintf(temp, "AT+CIPSTARTEX=\"TCP\",\"%s\",%s\r\n", ip, port); - wifi_spi_send_command(temp); - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI UDP模式时立即发送函数 +// 参数说明 void +// 返回参数 uint8 状态 0-成功 1-错误 +// 使用示例 +// 备注信息 在UDP模式下模块收到数据后会等待2毫秒,2毫秒后未收到数据则将数据通过socket发送到网络,如果希望立即发送则在数据传输完毕后调用此函数 +//------------------------------------------------------------------------------------------------------------------- +uint8 wifi_spi_udp_send_now (void) +{ + uint8 return_state = 1; + wifi_spi_packets_struct temp_packets; + + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + do { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - // 设置传输模式 - if(wifi_spi_set_transfer_model(WIFI_SPI_COMMAND == mode ? "0" : "1")) - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_send_command("AT+CIPSTATE?\r\n"); - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - break; - } - else - { - uint8 receiver_buffer[128]; - uint32 receiver_len = 128; - fifo_read_buffer(&wifi_spi_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); - char* buffer_index = (char *)receiver_buffer; - char* end_index; - - buffer_index += 22; - buffer_index += strlen(ip); - buffer_index += strlen(port); - end_index = strchr(buffer_index, ','); - - memcpy(wifi_spi_information.local_port, " ", 7); - memcpy(wifi_spi_information.local_port, buffer_index, (end_index - buffer_index)); - } - - wifi_spi_information.connect_state = WIFI_SPI_SERVER_ON; - wifi_spi_information.connect_mode = WIFI_SPI_TCP_CLIENT; - wifi_spi_information.transfer_mode = mode; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SERIANET == mode) // 透传模式下直接开启透传 - { - if(wifi_spi_entry_serianet()) + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) { - return_state = 1; break; } - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 建立UDP连接 -// 参数说明 *ip 远端 IPv4 地址、IPv6 地址 或域名 字符串形式 -// 参数说明 *port 远端端口值 字符串形式 -// 参数说明 *local_port 远端 IPv4 地址、IPv6 地址 或域名 字符串形式 -// 参数说明 mode 模块数据通信模式 -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_connect_udp_client("192.168.101.110", "8080", "8080", WIFI_SPI_COMMAND); -// 备注信息 自动分配ID -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_connect_udp_client (char *ip, char *port, char *local_port, wifi_spi_transfer_mode_enum mode) -{ - char temp[64]; - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - do - { - if(wifi_spi_set_connect_model("0")) - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 + // 立即开始socket发送 + temp_packets.head.command = WIFI_SPI_UDP_SEND; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + + // 等待应答信号 + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + + // 接收应答信号 + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, temp_packets.head.length); + + if(WIFI_SPI_REPLY_OK == temp_packets.head.command) + { + return_state = 0; + } + + }while(0); - sprintf(temp, "AT+CIPSTARTEX=\"UDP\",\"%s\",%s,%s\r\n", ip, port, local_port); - wifi_spi_send_command(temp); + // 将通讯状态设置为空闲 + wifi_spi_mutex = WIFI_SPI_IDLE; + } + + return return_state; +} - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 WIFI SPI 数据块发送函数并同步接收数据 +// 参数说明 *buff 需要发送的数据地址 +// 参数说明 length 发送长度 +// 返回参数 uint32 剩余未发送的长度 +// 使用示例 wifi_spi_send_buffer(buffer, 100); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +uint32 wifi_spi_send_buffer (const uint8 *buffer, uint32 length) +{ + uint16 send_length; + wifi_spi_packets_struct temp_packets; + + // 检查WIFI SPI状态,如果在其他中断或者线程中已经发起了通讯,则本次不能发送数据 + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + + while(length) { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_spi_set_transfer_model(WIFI_SPI_COMMAND == mode ? "0" : "1")) // 设置传输模式 - { - return_state = 1; - break; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(WIFI_SPI_SERIANET == mode) // 透传模式下直接开启透传 - { - if(wifi_spi_entry_serianet()) + send_length = length > WIFI_SPI_TRANSFER_SIZE ? (uint16)WIFI_SPI_TRANSFER_SIZE : (uint16)length; + + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) { - return_state = 1; break; } - } - memcpy(wifi_spi_information.local_port, " ", 7); - memcpy(wifi_spi_information.local_port, local_port, strlen(local_port)); - wifi_spi_information.connect_state = WIFI_SPI_SERVER_ON; - wifi_spi_information.connect_mode = WIFI_SPI_UDP_CLIENT; - wifi_spi_information.transfer_mode = mode; - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//-------------------------------------------------------------------------------------------------- -// 函数简介 断开连接 TCP Server 使用本接口将会断开所有连接 -// 参数说明 void -// 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_spi_disconnect_link(); -// 备注信息 -//-------------------------------------------------------------------------------------------------- -uint8 wifi_spi_disconnect_link (void) -{ - uint8 return_state = 0; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - do - { - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - wifi_spi_send_command("AT+CIPCLOSE=5\r\n"); - } - else - { - wifi_spi_send_command("AT+CIPCLOSE\r\n"); - } - - if(wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) - { - return_state = 1; - wifi_spi_information.connect_state = WIFI_SPI_SERVER_OFF; - break; - } - }while(0); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - - return return_state; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送字节函数 -// 参数说明 data 需要发送的数据 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_byte(0xa5); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_byte (uint8 data) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - send_length = 1; - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data(&data, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else - { - send_length = (uint16)wifi_spi_write_data(&data, send_length); - } - } - } - - return send_length; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送缓冲区函数 -// 参数说明 buff 需要发送的数据地址 -// 参数说明 len 发送长度 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_buffer("123", 3); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 len) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - while(len) - { - if((WIFI_SPI_WRITE_MAX * 2) < len) send_length = WIFI_SPI_WRITE_MAX * 2; - else - { - send_length = (uint16)len; - } - len -= send_length; - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data(buff, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } - buff += send_length; - } - - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else - { - len = wifi_spi_write_data(buff, len); - } - } - } - - return len; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送缓冲区函数(多个源地址) -// 参数说明 *multi_buffer 多个源地址以及每个源地址需要发送的长度 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 -// 备注信息 需要发送多个数组时,采用此函数可以极大的降低通讯时间,发送数据总长度不能超过4092 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_buffer_multi (wifi_spi_send_multi_struct *multi_buffer) -{ - uint8 i; - uint16 remain_length; - - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - for(i = 0; i < WIFI_SPI_MAX_MULTI; i++) - { - if(multi_buffer->source[i]) wifi_spi_send_buffer(multi_buffer->source[i], multi_buffer->length[i]); - } - } - else - { - remain_length = (uint16)wifi_spi_write_data_multi(multi_buffer); - } - } - } - - return remain_length; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi模块 发送字符串函数 -// 参数说明 *str 需要发送的数据 -// 返回参数 uint32 剩余未发送数据长度 -// 使用示例 wifi_spi_send_string("123"); -// 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 -//------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_send_string (const char *str) -{ - char temp[64]; - uint8 temp_length; - uint16 send_length; - - send_length = (uint16)strlen(str); - if(wifi_spi_init_flag) - { - if(WIFI_SPI_SERVER_ON == wifi_spi_information.connect_state) - { - if(WIFI_SPI_COMMAND == wifi_spi_information.transfer_mode) - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - temp_length = (uint8)sprintf(temp, "AT+CIPSEND="); - - if(WIFI_SPI_TCP_SERVER == wifi_spi_information.connect_mode) - { - temp_length += sprintf(&temp[temp_length], "0,"); - } - - temp_length += sprintf(&temp[temp_length], "%u\r\n", send_length); - - wifi_spi_send_command(temp); - if(0 == wifi_spi_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 - { - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_write_data((uint8 *)str, send_length); - wifi_spi_wait_ack("bytes", 50); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - wifi_spi_wait_ack("OK", WAIT_TIME_OUT); - } + wifi_spi_transfer_data(buffer, &temp_packets, send_length); - wifi_spi_clear_receive_buffer(); // 清空WiFi接收缓冲区 - } - else + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) { - send_length = (uint16)wifi_spi_write_data((uint8 *)str, send_length); + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + + length -= send_length; + buffer += send_length; + } + + // 检查最后一次的接收是否将所有的数据都接收完毕 + while(WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) + { + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + + // 继续读取模块剩余数据 + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } } } + wifi_spi_mutex = WIFI_SPI_IDLE; } - - return send_length; + return length; } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 WiFi 模块数据接收函数 -// 参数说明 buffer 接收数据的存放地址 -// 参数说明 len 数组长度,可直接填写或者使用sizeof求得 -// 返回参数 uint32 返回实际接收到的数据长度 -// 使用示例 uint8 test_buffer[256]; wifi_spi_read_buffer(&test_buffer[0], sizeof(test_buffer)); +// 函数简介 WIFI SPI 读取缓冲区 +// 参数说明 *buff 接收缓冲区 +// 参数说明 length 读取数据长度 +// 返回参数 uint32 实际读取数据长度 +// 使用示例 wifi_spi_read_buffer(buffer, 100); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 len) +uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 length) { - fifo_read_buffer(&wifi_spi_fifo, buffer, &len, FIFO_READ_AND_CLEAN); - return len; + zf_assert(NULL != buffer); + uint32 data_len = length; + +#if(1 == WIFI_SPI_READ_TRANSFER) + + wifi_spi_packets_struct temp_packets; + // 检查WIFI SPI状态,如果在其他中断或者线程中已经发起了通讯,则本次不能发送数据 + if(WIFI_SPI_IDLE == wifi_spi_mutex) + { + // 将通讯状态设置为忙 + wifi_spi_mutex = WIFI_SPI_BUSY; + + // 发起通讯查看模块内是否有数据未读取 + do + { + if(wifi_spi_wait_idle(OTHER_TIME_OUT)) + { + break; + } + temp_packets.head.command = WIFI_SPI_DATA; + temp_packets.head.length = 0; + wifi_spi_transfer_command(&temp_packets, WIFI_SPI_RECVIVE_SIZE); + // 检查收到的包中是否有数据 + if((WIFI_SPI_REPLY_DATA_START == temp_packets.head.command) || (WIFI_SPI_REPLY_DATA_END == temp_packets.head.command)) + { + // 保存接收到的数据 + if(temp_packets.head.length) + { + fifo_write_buffer(&wifi_spi_fifo, temp_packets.buffer, temp_packets.head.length); + } + } + }while(WIFI_SPI_REPLY_DATA_START == temp_packets.head.command); + wifi_spi_mutex = WIFI_SPI_IDLE; + } +#endif + + fifo_read_buffer(&wifi_spi_fifo, buffer, &data_len, FIFO_READ_AND_CLEAN); + return data_len; } -//-------------------------------------------------------------------------------------------------- -// 函数简介 wifi spi handshake中断回调函数 -// 参数说明 void -// 返回参数 void -// 备注信息 内部调用 -//-------------------------------------------------------------------------------------------------- -void wifi_spi_callback (void) -{ - wifi_spi_check_state_read_buffer(); - wifi_spi_ack_flag = 1; // ACK标志位置1 -} - - //------------------------------------------------------------------------------------------------------------------- // 函数简介 WiFi 模块初始化 // 参数说明 *wifi_ssid 目标连接的 WiFi 的名称 字符串形式 // 参数说明 *pass_word 目标连接的 WiFi 的密码 字符串形式 -// 参数说明 wifi_mode 模块的工作模式 参照 zf_device_wireless_spi.h 中 wifi_spi_mode_enum 枚举 // 返回参数 uint8 模块初始化状态 0-成功 1-错误 -// 使用示例 wifi_spi_init("SEEKFREE_2.4G", "SEEKFREEV2", WIFI_UART_STATION); -// 备注信息 初始化会首先设置串口配置,之后会对模块进行基本参数配置 -// 具体的配置信息可以在 zf_device_wireless_spi.h 文件中修改 +// 使用示例 wifi_spi_init("SEEKFREE", "SEEKFREE123"); +// 备注信息 wifi_spi_init("SEEKFREE", NULL); // 连接没有密码的WIFI热点 //------------------------------------------------------------------------------------------------------------------- -uint8 wifi_spi_init (char *wifi_ssid, char *pass_word, wifi_spi_mode_enum wifi_mode) +uint8 wifi_spi_init (char *wifi_ssid, char *pass_word) { uint8 return_state = 0; - uint32 temp_isr; - - spi_init(WIFI_SPI_INDEX, SPI_MODE0, WIFI_SPI_SPEED, WIFI_SPI_SCK_PIN, WIFI_SPI_MOSI_PIN, WIFI_SPI_MISO_PIN, SPI_CS_NULL);//硬件SPI初始化 - set_wireless_type(WIFI_SPI, wifi_spi_callback); - fifo_init(&wifi_spi_fifo, FIFO_DATA_8BIT, wifi_spi_buffer, WIFI_SPI_BUFFER_SIZE); + fifo_init(&wifi_spi_fifo, FIFO_DATA_8BIT, wifi_spi_buffer, WIFI_SPI_RECVIVE_FIFO_SIZE); + spi_init(WIFI_SPI_INDEX, SPI_MODE3, WIFI_SPI_SPEED, WIFI_SPI_SCK_PIN, WIFI_SPI_MOSI_PIN, WIFI_SPI_MISO_PIN, SPI_CS_NULL);//硬件SPI初始化 gpio_init(WIFI_SPI_CS_PIN, GPO, 1, GPO_PUSH_PULL); gpio_init(WIFI_SPI_RST_PIN, GPO, 1, GPO_PUSH_PULL); - - temp_isr = interrupt_global_disable(); - - exti_init(WIFI_SPI_INT_PIN, EXTI_TRIGGER_RISING); - + gpio_init(WIFI_SPI_INT_PIN, GPI, 0, GPI_PULL_DOWN); + + // 复位 gpio_set_level(WIFI_SPI_RST_PIN, 0); - system_delay_ms(50); + system_delay_ms(10); gpio_set_level(WIFI_SPI_RST_PIN, 1); - system_delay_ms(1000); + + // 等待模块初始化 + system_delay_ms(100); + wifi_spi_mutex = WIFI_SPI_IDLE; - exti_flag_clear(WIFI_SPI_INT_PIN); - - interrupt_global_enable(temp_isr); do { - if(wifi_spi_echo_set("0")) // 关闭模块回写 + // 固件版本信息以字符串形式保存在wifi_spi_version数组中 + return_state = wifi_spi_get_version(); + if(return_state) + { + break; + } + + // MAC地址信息以字符串形式保存在wifi_spi_mac_addr数组中 + wifi_spi_get_mac_addr(); + + + return_state = wifi_spi_wifi_connect(wifi_ssid, pass_word); + if(return_state) { - zf_log(0, "exit echo failed"); - return_state = 1; break; } - if(wifi_spi_auto_connect_wifi("0")) // 关闭自动连接 + #if(1 == WIFI_SPI_AUTO_CONNECT) + return_state = wifi_spi_socket_connect("TCP", WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT); + if(return_state) { - zf_log(0, "close auto connect failed"); - return_state = 1; break; } - - if(wifi_spi_set_model(wifi_mode)) // 设置运行模式 + #endif + + #if(2 == WIFI_SPI_AUTO_CONNECT) + return_state = wifi_spi_socket_connect("UDP", WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT); + if(return_state) { - zf_log(0, "set run mode failed"); - return_state = 1; break; } - - if(wifi_spi_close_sleep_model()) // 关闭睡眠模式 - { - zf_log(0, "set sleep mode failed"); - return_state = 1; - break; - } - - if(wifi_spi_set_wifi((char *)wifi_ssid, (char *)pass_word)) // 连接 wifi 或者开启热点 - { - zf_log(0, "wifi set failed"); - return_state = 1; - break; - } - - if(wifi_spi_get_information()) // 模块基本参数获取 - { - zf_log(0, "get module information failed"); - return_state = 1; - break; - } -#if WIFI_SPI_AUTO_CONNECT == 1 - if(wifi_spi_connect_tcp_servers(WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_SERIANET)) // 连接TCP服务器 - { - zf_log(0, "connect TCP server failed"); - return_state = 1; - break; - } -#endif -#if WIFI_SPI_AUTO_CONNECT == 2 - if(wifi_spi_connect_udp_client(WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT, WIFI_SPI_SERIANET)) // 建立UDP连接 - { - zf_log(0, "connect UDP server failed"); - return_state = 1; - break; - } -#endif - // 模块初始化成功 - wifi_spi_init_flag = 1; + #endif }while(0); - + return return_state; } diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_wifi_spi.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_wifi_spi.h index 5e5a025..24e7eb1 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_wifi_spi.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_wifi_spi.h @@ -24,13 +24,13 @@ * 文件名称 zf_device_wifi_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ -* +* * 修改记录 * 日期 作者 备注 -* 2023-05-27 pudding first version +* 2024-01-18 SeekFree first version ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,128 +53,100 @@ #include "zf_common_typedef.h" + #define WIFI_SPI_INDEX (SPI_3 ) // 定义使用的SPI号 -#define WIFI_SPI_SPEED (30 * 1000 * 1000 ) // 硬件 SPI 速率 +#define WIFI_SPI_SPEED (50 * 1000 * 1000 ) // 硬件 SPI 速率 #define WIFI_SPI_SCK_PIN (SPI3_SCLK_P22_3 ) // 定义SPI_SCK引脚 #define WIFI_SPI_MOSI_PIN (SPI3_MOSI_P22_0 ) // 定义SPI_MOSI引脚 #define WIFI_SPI_MISO_PIN (SPI3_MISO_P22_1 ) // 定义SPI_MISO引脚 IPS没有MISO引脚,但是这里任然需要定义,在spi的初始化时需要使用 #define WIFI_SPI_CS_PIN (P22_2 ) // 定义SPI_CS引脚 采用软件CS引脚 -#define WIFI_SPI_INT_PIN (ERU_CH5_REQ1_P15_8) // 定义中断引脚 +#define WIFI_SPI_INT_PIN (P15_8 ) // 定义握手引脚 #define WIFI_SPI_RST_PIN (P23_1 ) // 定义复位引脚 - - -#define WIFI_SPI_BUFFER_SIZE (1024) // 定义SPI接收的缓冲区大小 -#define WIFI_SPI_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不连接 1-自动连接TCP服务器并进入透传模式 2-自动连接UDP服务器并进入透传模式 3:自动建立TCP服务器 - -#if (WIFI_SPI_AUTO_CONNECT > 2) + +#define WIFI_SPI_RECVIVE_FIFO_SIZE (1024) // 接收FIFO大小 +#define WIFI_SPI_READ_TRANSFER (1) // 在调用wifi_spi_read_buffer 是否尝试发起SPI通讯来检测模块内是否有数据需要读取 1:发起SPI通讯 0:不发起SPI通讯,仅读取FIFO + // 如果应用程序中没有任何的地方调用发送函数,则WIFI_SPI_READ_TRANSFER必须设置为1 + +#define WIFI_SPI_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不自动连接 1-自动连接TCP服务器 2-自动连接UDP + +#if (WIFI_SPI_AUTO_CONNECT > 2) #error "WIFI_SPI_AUTO_CONNECT 的值只能为 [0,1,2]" #else -#define WIFI_SPI_TARGET_IP "192.168.2.28" // 连接目标的 IP +#define WIFI_SPI_TARGET_IP "192.168.137.1" // 连接目标的 IP #define WIFI_SPI_TARGET_PORT "8080" // 连接目标的端口 -#define WIFI_SPI_LOCAL_PORT "8080" // 本机端口 +#define WIFI_SPI_LOCAL_PORT "6666" // 本机的端口 0:随机 可设置范围2048-65535 默认 6666 #endif -#define WIFI_SPI_MAX_MULTI (17) // 多地址发送,最大8个地址 -typedef enum -{ - BUFFER_IDLE, // 模块的缓冲区是空闲的 - BUFFER_READ, // 模块的缓冲区有数据需要读取 - BUFFER_WRITE, // 模块的缓冲区是可写的 -}wifi_spi_buffer_state_enum; +#define WIFI_SPI_RECVIVE_SIZE (32) // 每次SPI传输接收的字节数 不允许修改 +#define WIFI_SPI_TRANSFER_SIZE (4088) // 最大SPI传输接收的字节数 不允许修改 + + typedef enum -{ - TRANSMIT_IDLE, // 当前没有传输 - TRANSMIT_WRITE_REQUEST, // 给模块发送了一个传输请求 - TRANSMIT_READ_STATE, // 读取模块状态 - TRANSMIT_READ, // 正在读取模块内部数据 - TRANSMIT_WRITE, // 正在往模块写入数据 -}wifi_spi_transmit_state_enum; - -typedef enum -{ - WIFI_SPI_STATION, // 设备模式 - WIFI_SPI_SOFTAP, // AP模式 -}wifi_spi_mode_enum; - -typedef enum -{ - WIFI_SPI_COMMAND, // 使用命令的方式发送数据 - WIFI_SPI_SERIANET, // 使用透传的方式发送数据 -}wifi_spi_transfer_mode_enum; - -typedef enum -{ - WIFI_SPI_TCP_CLIENT, // 模块连接TCP服务器 - WIFI_SPI_TCP_SERVER, // 模块作为TCP服务器 - WIFI_SPI_UDP_CLIENT, // 模块启用UDP连接 -}wifi_spi_connect_mode_enum; - -typedef enum -{ - WIFI_SPI_SERVER_OFF, // 模块未连接服务器 - WIFI_SPI_SERVER_ON, // 模块已经连接服务器 -}wifi_spi_connect_state_enum; - -typedef enum -{ - WIFI_SPI_LINK_0, // 模块当前链接 0 - WIFI_SPI_LINK_1, // 模块当前链接 1 - WIFI_SPI_LINK_2, // 模块当前链接 2 - WIFI_SPI_LINK_3, // 模块当前链接 3 - WIFI_SPI_LINK_4, // 模块当前链接 4 -}wifi_spi_link_id_enum; - -typedef struct { - uint8 reserve; - uint8 cmd; - uint8 addr; - uint8 dummy; - uint8 magic; - uint8 sequence; - uint16 length; -}wifi_spi_buffer_struct; + // 主机发送的命令 + WIFI_SPI_INVALID1 = 0x00, // 无效数据包 + WIFI_SPI_RESET = 0x01, // 复位命令 + WIFI_SPI_DATA = 0x02, // 透传数据包 + WIFI_SPI_UDP_SEND = 0x03, // UDP下立即发送命令,默认SPI接收数据后2MS未收到数据自动发送数据 + WIFI_SPI_CLOSE_SOCKET = 0x04, // 断开连接 + + WIFI_SPI_SET_WIFI_INFORMATION = 0x10, // 设置WIFI信息命令 + WIFI_SPI_SET_SOCKET_INFORMATION = 0x11, // 设置SOCKET信息命令 + + WIFI_SPI_GET_VERSION = 0x20, // 获取模块版本 + WIFI_SPI_GET_MAC_ADDR = 0x21, // 获取模块MAC地址 + WIFI_SPI_GET_IP_ADDR = 0x22, // 获取模块IP地址 + + // 从机回传的命令 + WIFI_SPI_REPLY_OK = 0x80, // 从机应答的正确命令 + WIFI_SPI_REPLY_ERROR = 0x81, // 从机应答的错误命令 + + WIFI_SPI_REPLY_DATA_START = 0x90, // 从机回传的数据包,并且还有数据需要主机读取 + WIFI_SPI_REPLY_DATA_END = 0x91, // 从机回传的数据包,数据已读取完毕 + + WIFI_SPI_REPLY_VERSION = 0xA0, // 从机回复固件版本 + WIFI_SPI_REPLY_MAC_ADDR = 0xA1, // 从机回复本机MAC地址等信息 + WIFI_SPI_REPLY_IP_ADDR = 0xA2, // 从机回复本机IP地址、端口号 + WIFI_SPI_INVALID2 = 0xFF // 无效数据包 +}wifi_spi_packets_command_enum; + +typedef enum +{ + WIFI_SPI_IDLE, // 模块空闲,可以进行SPI通讯 + WIFI_SPI_BUSY, // 模块正忙,不可进行SPI通讯 +}wifi_spi_state_enum; + + +typedef struct +{ + uint8 command; // 命令字 + uint8 reserve; // 保留 + uint16 length; // 包有效长度 +}wifi_spi_head_struct; + + +typedef struct +{ + wifi_spi_head_struct head; // 帧头 + uint8 buffer[WIFI_SPI_RECVIVE_SIZE]; // 缓冲区 +}wifi_spi_packets_struct; + + +extern char wifi_spi_version[12]; // 固件版本 字符串 +extern char wifi_spi_mac_addr[20]; // 模块MAC地址 字符串 +extern char wifi_spi_ip_addr_port[25]; // IP地址与端口号 字符串 -typedef struct -{ - uint8 version[12]; // 固件版本 字符串形式 - uint8 mac[20]; // 本机 MAC 地址 字符串形式 - uint8 local_ip[17]; // 本机 IP 地址 字符串形式 - uint8 local_port[10]; // 本机端口号 字符串形式 - uint8 remote_ip[5][17]; // 远端 IP 地址 字符串形式 - wifi_spi_mode_enum mode; // WIFI 模式 - wifi_spi_transfer_mode_enum transfer_mode; // 当前传输模式 - wifi_spi_connect_mode_enum connect_mode; // 网络连接模式 - wifi_spi_connect_state_enum connect_state; // 服务器连接情况 -}wifi_spi_information_struct; +uint8 wifi_spi_wifi_connect (char *wifi_ssid, char *pass_word); +uint8 wifi_spi_socket_connect (char *transport_type, char *ip_addr, char *port, char *local_port); +uint8 wifi_spi_socket_disconnect (void); +uint8 wifi_spi_udp_send_now (void); +uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 length); +uint32 wifi_spi_read_buffer (uint8 *buffer, uint32 length); -typedef struct -{ - uint8 *source[WIFI_SPI_MAX_MULTI]; - uint16 length[WIFI_SPI_MAX_MULTI]; -}wifi_spi_send_multi_struct; - -extern wifi_spi_information_struct wifi_spi_information; - - -uint8 wifi_spi_disconnected_wifi (void); // 断开 WIFI 连接 -uint8 wifi_spi_entry_serianet (void); // 打开透传模式 -uint8 wifi_spi_exit_serianet (void); // 关闭透传模式 - -uint8 wifi_spi_connect_tcp_servers (char *ip, char *port, wifi_spi_transfer_mode_enum mode); // 建立 TCP 连接 -uint8 wifi_spi_connect_udp_client (char *ip, char *port, char *local_port, wifi_spi_transfer_mode_enum mode); // 建立 UDP 传输 -uint8 wifi_spi_disconnect_link (void); // 断开连接 TCP Server 使用本接口将会断开所有连接 - -uint32 wifi_spi_send_byte (uint8 data); // WIFI 模块发送字节函数 -uint32 wifi_spi_send_buffer (const uint8 *buff, uint32 length); // WIFI 模块发送缓冲区函数 -uint32 wifi_spi_send_buffer_multi (wifi_spi_send_multi_struct *multi_buffer); // WIFI 模块发送多缓冲区函数 -uint32 wifi_spi_send_string (const char *str); // WIFI 模块发送字符串函数 - -uint32 wifi_spi_read_buffer (uint8 *buff, uint32 len); // WIFI 模块数据接收函数 - -uint8 wifi_spi_init (char *wifi_ssid, char *pass_word, wifi_spi_mode_enum wifi_mode); // WIFI 模块初始化函数 +uint8 wifi_spi_init (char *wifi_ssid, char *pass_word); #endif + diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_wifi_uart.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_wifi_uart.c index 312dab7..ff728bb 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_wifi_uart.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_wifi_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_wifi_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -61,7 +61,7 @@ wifi_uart_information_struct wifi_uart_information; // 模块自身参数 -static fifo_obj_struct wifi_uart_fifo; +static fifo_struct wifi_uart_fifo; static uint8 wifi_uart_buffer[WIFI_UART_BUFFER_SIZE]; // 数据存放数组 static uint8 wifi_uart_data; diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_wifi_uart.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_wifi_uart.h index abcb253..3316b6f 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_wifi_uart.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_wifi_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_wifi_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_wireless_uart.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_wireless_uart.c index eac2867..91ec013 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_wireless_uart.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_wireless_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_device_wireless_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -53,7 +53,7 @@ #include "zf_device_type.h" #include "zf_device_wireless_uart.h" -static fifo_obj_struct wireless_uart_fifo; +static fifo_struct wireless_uart_fifo; static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; static uint8 wireless_uart_data = 0; diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_wireless_uart.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_wireless_uart.h index 2418545..a789ad0 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_wireless_uart.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_wireless_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_device_wireless_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -61,11 +61,11 @@ // 注意事项2:开启自动波特率务必连接RTS引脚 否则会开启失败。 // 注意事项3:模块自动波特率失败的话 可以尝试断电重启 -// 开启自动波特率务必阅读上面两条 注意事项 -// 开启自动波特率务必阅读上面两条 注意事项 -// 开启自动波特率务必阅读上面两条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 +// 开启自动波特率务必阅读上面三条 注意事项 -// 0:关闭自动波特率 +// 0:关闭自动波特率 // 1:开启自动波特率 自动波特率的作用是修改 WIRELESS_UART_BAUD 之后不需要对模块进行配置 模块会自动设置为对应的波特率 #define WIRELESS_UART_AUTO_BAUD_RATE ( 1 ) diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_adc.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_adc.c index 9a262a1..06694d8 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_adc.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_adc.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_adc * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_adc.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_adc.h index 378b67e..f017c76 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_adc.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_adc.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_adc * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_delay.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_delay.c index 4ec533c..ae3e610 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_delay.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_delay.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_delay * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_delay.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_delay.h index e8d82ef..7b8b475 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_delay.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_delay.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_delay * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_dma.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_dma.c index f72f1d6..43bffbc 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_dma.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_dma.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_dma * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_dma.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_dma.h index 1ec555b..320d40c 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_dma.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_dma.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_dma * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_encoder.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_encoder.c index 6592198..0e0e0b9 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_encoder.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_encoder.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_encoder.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_encoder.h index 68d159f..e079122 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_encoder.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_encoder.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_encoder * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_exti.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_exti.c index 72c9a1f..31d270a 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_exti.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_exti.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_exti * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_exti.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_exti.h index 30f5ef6..b63f9ee 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_exti.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_exti.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_exti * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_flash.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_flash.c index f91f5a0..325cfed 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_flash.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_flash.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_flash * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_flash.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_flash.h index 912585a..e7425fd 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_flash.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_flash.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_flash * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_gpio.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_gpio.c index 5071114..a084353 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_gpio.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_gpio.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_gpio * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_gpio.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_gpio.h index 2b23be0..550fb8d 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_gpio.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_gpio.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_gpio * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_pit.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_pit.c index c4dc50d..5e03d38 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_pit.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_pit.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pit * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_pit.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_pit.h index 5461e05..66854b5 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_pit.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_pit.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pit * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_pwm.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_pwm.c index ad1059a..24d8d7a 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_pwm.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_pwm.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pwm * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_pwm.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_pwm.h index d6dce78..51948a4 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_pwm.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_pwm.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_pwm * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_soft_iic.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_soft_iic.c index 9833b62..a349ec7 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_soft_iic.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_soft_iic.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_iic * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_soft_iic.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_soft_iic.h index a62b262..80db53b 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_soft_iic.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_soft_iic.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_iic * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_soft_spi.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_soft_spi.c index 292c60b..954fbe3 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_soft_spi.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_soft_spi.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_soft_spi.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_soft_spi.h index 6a9c207..62858de 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_soft_spi.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_soft_spi.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_soft_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_spi.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_spi.c index 1b99196..f817dd9 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_spi.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_spi.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -920,7 +920,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 do { - IfxQspi_writeTransmitFifo(moudle, (uint8)(*write_buffer & 0xFF00) >> 8); // 将发送的数据写入缓冲区 + IfxQspi_writeTransmitFifo(moudle, (uint8)((*write_buffer & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 if(read_buffer != NULL) { diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_spi.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_spi.h index e73507e..d15589c 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_spi.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_spi.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_spi * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_timer.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_timer.c index a953b92..e085d6e 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_timer.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_timer.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_timer * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_timer.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_timer.h index 3c86f58..1bb348f 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_timer.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_timer.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_timer * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_uart.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_uart.c index cd19782..fb89b55 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_uart.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_uart.c @@ -24,7 +24,7 @@ * 文件名称 zf_driver_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_uart.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_uart.h index 8d1d111..cdc55ab 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_uart.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_uart.h @@ -24,7 +24,7 @@ * 文件名称 zf_driver_uart * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * diff --git a/Example/E14_specifies_variable_or_code_location_demo/user/isr.c b/Example/E14_specifies_variable_or_code_location_demo/user/isr.c index 27171d2..9108ff0 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/user/isr.c +++ b/Example/E14_specifies_variable_or_code_location_demo/user/isr.c @@ -24,7 +24,7 @@ * 文件名称 isr * 公司名称 成都逐飞科技有限公司 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 -* 开发环境 ADS v1.9.4 +* 开发环境 ADS v1.9.20 * 适用平台 TC264D * 店铺链接 https://seekfree.taobao.com/ * @@ -118,7 +118,7 @@ IFX_INTERRUPT(exti_ch1_ch5_isr, 0, EXTI_CH1_CH5_INT_PRIO) { exti_flag_clear(ERU_CH5_REQ1_P15_8); - wireless_module_spi_handler(); // SPI WIFI 中断回调函数 + } } diff --git a/Example/E15_fft_demo/.cproject b/Example/E15_fft_demo/.cproject index 7d34c88..a823b48 100644 --- a/Example/E15_fft_demo/.cproject +++ b/Example/E15_fft_demo/.cproject @@ -108,12 +108,19 @@ + +