diff --git a/Example/E01_gpio_demo/libraries/doc/version.txt b/Example/E01_gpio_demo/libraries/doc/version.txt
index f45bf81..4df6214 100644
--- a/Example/E01_gpio_demo/libraries/doc/version.txt
+++ b/Example/E01_gpio_demo/libraries/doc/version.txt
@@ -1,3 +1,7 @@
+V3.3.2
+ 新增zf_device_menc15a磁编码器外设驱动
+ 更改uart接收机部分语句
+ 修正SPI的16位通讯错位问题
V3.3.1
移除正交编码器的断言检测
新增重命名工程工具
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 3a140e3..c8f75f2 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
@@ -93,6 +93,7 @@
#include "zf_device_ips114.h"
#include "zf_device_ips200.h"
#include "zf_device_key.h"
+#include "zf_device_menc15a.h"
#include "zf_device_mpu6050.h"
#include "zf_device_mt9v03x.h"
#include "zf_device_oled.h"
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 cc42e43..adfc4a3 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
@@ -91,8 +91,10 @@ ZF_WEAK void seekfree_assistant_interface_init (seekfree_assistant_transfer_devi
{
case SEEKFREE_ASSISTANT_DEBUG_UART:
{
+#if DEBUG_UART_USE_INTERRUPT == 1
seekfree_assistant_transfer_callback = debug_send_buffer;
seekfree_assistant_receive_callback = debug_read_ring_buffer;
+#endif
}break;
case SEEKFREE_ASSISTANT_WIRELESS_UART:
diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_menc15a.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_menc15a.c
new file mode 100644
index 0000000..faaeba2
--- /dev/null
+++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_menc15a.c
@@ -0,0 +1,188 @@
+/*********************************************************************************************************************
+* CYT2BL3 Opensourec Library 即( CYT2BL3 开源库)是一个基于官方 SDK 接口的第三方开源库
+* Copyright (c) 2022 SEEKFREE 逐飞科技
+*
+* 本文件是 CYT2BL3 开源库的一部分
+*
+* CYT2BL3 开源库 是免费软件
+* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
+* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
+*
+* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
+* 甚至没有隐含的适销性或适合特定用途的保证
+* 更多细节请参见 GPL
+*
+* 您应该在收到本开源库的同时收到一份 GPL 的副本
+* 如果没有,请参阅
+*
+* 额外注明:
+* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
+* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
+* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
+* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
+*
+* 文件名称 zf_device_menc15a
+* 公司名称 成都逐飞科技有限公司
+* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
+* 开发环境 IAR 9.40.1
+* 适用平台 CYT2BL3
+* 店铺链接 https://seekfree.taobao.com/
+*
+* 修改记录
+* 日期 作者 备注
+* 2024-11-19 pudding first version
+********************************************************************************************************************/
+/*********************************************************************************************************************
+* 接线定义:
+* ------------------------------------
+* 模块管脚 单片机管脚
+* // 硬件 SPI 引脚
+* SCL/SPC 查看 zf_device_menc15a.h 中 MENC15A_SPC_PIN 宏定义
+* SDA/DSI 查看 zf_device_menc15a.h 中 MENC15A_SDI_PIN 宏定义
+* SA0/SDO 查看 zf_device_menc15a.h 中 MENC15A_SDO_PIN 宏定义
+* CS 查看 zf_device_menc15a.h 中 MENC15A_CS_PIN 宏定义
+* VCC 3.3V电源
+* GND 电源地
+* 其余引脚悬空
+* ------------------------------------
+********************************************************************************************************************/
+
+#include "zf_common_debug.h"
+#include "zf_common_function.h"
+#include "zf_device_config.h"
+#include "zf_driver_delay.h"
+#include "zf_driver_gpio.h"
+#include "zf_driver_spi.h"
+
+#include "zf_device_menc15a.h"
+
+uint16 menc15a_absolute_data[2] = {0};
+
+int16 menc15a_absolute_offset_data[2] = {0};
+
+int16 menc15a_speed_data[2] = {0};
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 计算编码器旋转偏差
+// 参数说明 encoder_max 编码器精度 填写十进制数据
+// 参数说明 now_location 当前位置信息
+// 参数说明 last_location 上一次的位置信息
+// 返回参数 int32 计算的偏差值
+// 使用示例 magnetic_encoder_get_offset();
+// 备注信息
+//-------------------------------------------------------------------------------------------------------------------
+static int32 magnetic_encoder_get_offset (int32 encoder_max, int32 now_location, int32 last_location)
+{
+ int32 result_data = 0;
+
+ if((encoder_max / 2) < func_abs(now_location - last_location))
+ {
+ result_data = ((encoder_max / 2) < now_location ? (now_location - encoder_max - last_location) : (now_location + encoder_max - last_location));
+ }
+ else
+ {
+ result_data = (now_location - last_location);
+ }
+
+ return result_data;
+}
+
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 获取 MENC15A 磁编码器 的 绝对值 角度数据
+// 参数说明 menc15a_module 磁编码器 模块号
+// 返回参数 uint16 绝对值 角度数据
+// 使用示例 menc15a_1_get_absolute_data();
+// 备注信息 执行该函数后,可直接使用返回值 也可以通过查询对应变量获取结果
+//-------------------------------------------------------------------------------------------------------------------
+uint16 menc15a_get_absolute_data(menc15a_module_enum menc15a_module)
+{
+ uint16 read_data = 0;
+
+ uint16 data_last = menc15a_absolute_data[menc15a_module];
+
+ if(menc15a_module == menc15a_1_module)
+ {
+ MENC15A_1_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_1_SPI, 0x8021);
+
+ MENC15A_1_CS(1);
+ }
+ else
+ {
+ MENC15A_2_CS(0);
+
+ spi_write_8bit(MENC15A_2_SPI, 0x80);
+ spi_write_8bit(MENC15A_2_SPI, 0x21);
+ read_data = spi_read_8bit(MENC15A_2_SPI);
+ read_data = ((read_data << 8) | spi_read_8bit(MENC15A_2_SPI));
+
+ MENC15A_2_CS(1);
+ }
+
+ menc15a_absolute_data[menc15a_module] = (read_data & 0x7fff);
+
+ menc15a_absolute_offset_data[menc15a_module] = (int16)magnetic_encoder_get_offset(32768, menc15a_absolute_data[menc15a_module], data_last);
+
+ return menc15a_absolute_data[menc15a_module];
+}
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 获取 MENC15A 磁编码器 的 转速数据
+// 参数说明 menc15a_module 磁编码器 模块号
+// 返回参数 int16 转速数据(每秒旋转弧度 rad/s)
+// 使用示例 menc15a_1_get_speed_data();
+// 备注信息 执行该函数后,可直接使用返回值 也可以通过查询对应变量获取结果
+//-------------------------------------------------------------------------------------------------------------------
+int16 menc15a_get_speed_data(menc15a_module_enum menc15a_module)
+{
+ int16 read_data = 0;
+
+ if(menc15a_module == menc15a_1_module)
+ {
+ MENC15A_1_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_1_SPI, 0x8032);
+
+ MENC15A_1_CS(1);
+ }
+ else
+ {
+ MENC15A_2_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_2_SPI, 0x8032);
+
+ MENC15A_2_CS(1);
+ }
+
+ read_data = (read_data & 0x7fff);
+
+ if(read_data > 16384)
+ {
+ read_data = read_data - 32768;
+ }
+
+ menc15a_speed_data[menc15a_module] = (int16)((float)read_data * 1.917476f);
+
+ return menc15a_speed_data[menc15a_module];
+}
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 初始化 MENC15A
+// 参数说明 void
+// 返回参数 uint8 1-初始化失败 0-初始化成功
+// 使用示例 menc15a_init();
+// 备注信息
+//-------------------------------------------------------------------------------------------------------------------
+uint8 menc15a_init(void)
+{
+ spi_init(MENC15A_1_SPI, SPI_MODE1, MENC15A_1_SPI_SPEED, MENC15A_1_CLK_PIN, MENC15A_1_MOSI_PIN, MENC15A_1_MISO_PIN, SPI_CS_NULL); // 配置 MENC15A-1 的 SPI端口
+ gpio_init(MENC15A_1_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); // 配置 MENC15A-1 的 CS端口
+
+ spi_init(MENC15A_2_SPI, SPI_MODE1, MENC15A_2_SPI_SPEED, MENC15A_2_CLK_PIN, MENC15A_2_MOSI_PIN, MENC15A_2_MISO_PIN, SPI_CS_NULL); // 配置 MENC15A-2 的 SPI端口
+ gpio_init(MENC15A_2_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); // 配置 MENC15A-2 的 CS端口
+
+ return 0;
+}
+
diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_menc15a.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_menc15a.h
new file mode 100644
index 0000000..068d877
--- /dev/null
+++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_menc15a.h
@@ -0,0 +1,102 @@
+/*********************************************************************************************************************
+* CYT2BL3 Opensourec Library 即( CYT2BL3 开源库)是一个基于官方 SDK 接口的第三方开源库
+* Copyright (c) 2022 SEEKFREE 逐飞科技
+*
+* 本文件是 CYT2BL3 开源库的一部分
+*
+* CYT2BL3 开源库 是免费软件
+* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
+* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
+*
+* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
+* 甚至没有隐含的适销性或适合特定用途的保证
+* 更多细节请参见 GPL
+*
+* 您应该在收到本开源库的同时收到一份 GPL 的副本
+* 如果没有,请参阅
+*
+* 额外注明:
+* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
+* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
+* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
+* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
+*
+* 文件名称 zf_device_menc15a
+* 公司名称 成都逐飞科技有限公司
+* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
+* 开发环境 IAR 9.40.1
+* 适用平台 CYT2BL3
+* 店铺链接 https://seekfree.taobao.com/
+*
+* 修改记录
+* 日期 作者 备注
+* 2024-11-19 pudding first version
+********************************************************************************************************************/
+/*********************************************************************************************************************
+* 接线定义:
+* ------------------------------------
+* 模块管脚 单片机管脚
+* // 硬件 SPI 引脚
+* CLK 查看 zf_device_menc15a.h 中 MENC15A_CLK_PIN 宏定义
+* MOSI 查看 zf_device_menc15a.h 中 MENC15A_MOSI_PIN 宏定义
+* MISO 查看 zf_device_menc15a.h 中 MENC15A_MISO_PIN 宏定义
+* CS 查看 zf_device_menc15a.h 中 MENC15A_CS_PIN 宏定义
+* VCC 3.3V电源
+* GND 电源地
+* 其余引脚悬空
+* ------------------------------------
+********************************************************************************************************************/
+
+
+#ifndef _zf_device_menc15a_h_
+#define _zf_device_menc15a_h_
+
+#include "zf_common_typedef.h"
+
+//================================================定义 MENC15A 基本配置================================================
+
+//====================================================硬件 SPI 驱动====================================================
+#define MENC15A_1_SPI_SPEED (20 * 1000 * 1000) // 磁编码器1 硬件 SPI 速率
+#define MENC15A_1_SPI (SPI_0 ) // 磁编码器1 硬件 SPI 号
+#define MENC15A_1_CLK_PIN (SPI0_SCLK_P20_11) // 磁编码器1 硬件 SPI SCK 引脚
+#define MENC15A_1_MOSI_PIN (SPI0_MOSI_P20_14) // 磁编码器1 硬件 SPI MOSI 引脚
+#define MENC15A_1_MISO_PIN (SPI0_MISO_P20_12) // 磁编码器1 硬件 SPI MISO 引脚
+#define MENC15A_1_CS_PIN (P20_13) // 磁编码器1 CS 片选引脚
+#define MENC15A_1_CS(x) ((x) ? (gpio_high(MENC15A_1_CS_PIN)) : (gpio_low(MENC15A_1_CS_PIN)))
+
+
+#define MENC15A_2_SPI_SPEED (20 * 1000 * 1000) // 磁编码器2 硬件 SPI 速率
+#define MENC15A_2_SPI (SPI_0 ) // 磁编码器2 硬件 SPI 号
+#define MENC15A_2_CLK_PIN (SPI0_SCLK_P20_11 ) // 磁编码器2 硬件 SPI SCK 引脚
+#define MENC15A_2_MOSI_PIN (SPI0_MOSI_P20_14 ) // 磁编码器2 硬件 SPI MOSI 引脚
+#define MENC15A_2_MISO_PIN (SPI0_MISO_P20_12 ) // 磁编码器2 硬件 SPI MISO 引脚
+#define MENC15A_2_CS_PIN (P20_15) // 磁编码器2 CS 片选引脚
+#define MENC15A_2_CS(x) ((x) ? (gpio_high(MENC15A_2_CS_PIN)) : (gpio_low(MENC15A_2_CS_PIN)))
+
+//====================================================硬件 SPI 驱动====================================================
+
+// 枚举磁编码模块
+typedef enum
+{
+ menc15a_1_module,
+ menc15a_2_module,
+
+}menc15a_module_enum;
+
+//================================================定义 MENC15A 基本配置================================================
+
+
+extern uint16 menc15a_absolute_data[2];
+
+extern int16 menc15a_absolute_offset_data[2];
+
+extern int16 menc15a_speed_data[2];
+
+
+uint16 menc15a_get_absolute_data(menc15a_module_enum menc15a_module);
+int16 menc15a_get_speed_data(menc15a_module_enum menc15a_module);
+
+uint8 menc15a_init(void);
+
+
+#endif
diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_uart_receiver.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_uart_receiver.c
index 3ebb3bd..ade446d 100644
--- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_uart_receiver.c
+++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_uart_receiver.c
@@ -91,7 +91,7 @@ static void uart_receiver_analysis (uart_receiver_struct *remote_data,uint8 * bu
remote_data->channel[num++] = (buffer[5] >> 1 | buffer[6] << 7 ) & 0x07FF;
remote_data->channel[num++] = (buffer[6] >> 4 | buffer[7] << 4 ) & 0x07FF;
remote_data->channel[num++] = (buffer[7] >> 7 | buffer[8] << 1 | buffer[9] << 9 ) & 0x07FF;
- remote_data->state = (SBUS_NORMAL_STATE == buffer[23]) ? 1 : 0;
+ remote_data->state = (SBUS_ABNORMAL_STATE == (buffer[23] & SBUS_ABNORMAL_STATE)) ? 0 : 1;
uart_receiver.finsh_flag = 1;
}
diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_uart_receiver.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_uart_receiver.h
index 948ab2f..6498dcb 100644
--- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_uart_receiver.h
+++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_uart_receiver.h
@@ -55,8 +55,7 @@
#define REV_DATA_LEN ( 25 ) // SBUS帧长
#define FRAME_STAR ( 0X0F ) // 帧头信息
#define FRAME_END ( 0X00 ) // 帧尾信息
-#define SBUS_NORMAL_STATE ( 0X03 ) // 正常状态
-#define SBUS_ABNORMAL_STATE ( 0X0F ) // 失控状态
+#define SBUS_ABNORMAL_STATE ( 0X04 ) // 失控状态
typedef struct
{
diff --git a/Example/E01_gpio_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt b/Example/E01_gpio_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
index 1c96965..40d9e28 100644
--- a/Example/E01_gpio_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
+++ b/Example/E01_gpio_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
@@ -88,6 +88,8 @@ zf_device_uart_receiver.h SUBS
zf_device_absolute_encoder.h 360° 位置传感器 绝对式迷你 mini 编码器 分辨率:0.088°
+zf_device_menc15a.h 15位高精度磁编码器驱动 位置式
+
zf_device_gnss.h GPS 及 RTK 定位模块 双频高精度定位模块 亚米级定位
zf_device_key.h GPIO 按键驱动 用于检测主板按键状态
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 f817dd9..d74841c 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
@@ -766,11 +766,11 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name
IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕 首次发送数据 此时接收缓冲区无数据
IfxQspi_writeTransmitFifo(moudle, (uint8)(register_name & 0x00FF)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 1); // 等待接收完毕 再次发送数据 此时接收缓冲区有1个数据
spi_clear_fifo(moudle); // 清除接收缓存区
@@ -818,11 +818,11 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name,
IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕 首次发送数据 此时接收缓冲区无数据
IfxQspi_writeTransmitFifo(moudle, (uint8)(register_name & 0x00FF)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 1); // 等待接收完毕 再次发送数据 此时接收缓冲区有1个数据
spi_clear_fifo(moudle); // 清除接收缓存区
diff --git a/Example/E02_uart_demo/libraries/doc/version.txt b/Example/E02_uart_demo/libraries/doc/version.txt
index f45bf81..4df6214 100644
--- a/Example/E02_uart_demo/libraries/doc/version.txt
+++ b/Example/E02_uart_demo/libraries/doc/version.txt
@@ -1,3 +1,7 @@
+V3.3.2
+ 新增zf_device_menc15a磁编码器外设驱动
+ 更改uart接收机部分语句
+ 修正SPI的16位通讯错位问题
V3.3.1
移除正交编码器的断言检测
新增重命名工程工具
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 3a140e3..c8f75f2 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
@@ -93,6 +93,7 @@
#include "zf_device_ips114.h"
#include "zf_device_ips200.h"
#include "zf_device_key.h"
+#include "zf_device_menc15a.h"
#include "zf_device_mpu6050.h"
#include "zf_device_mt9v03x.h"
#include "zf_device_oled.h"
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 cc42e43..adfc4a3 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
@@ -91,8 +91,10 @@ ZF_WEAK void seekfree_assistant_interface_init (seekfree_assistant_transfer_devi
{
case SEEKFREE_ASSISTANT_DEBUG_UART:
{
+#if DEBUG_UART_USE_INTERRUPT == 1
seekfree_assistant_transfer_callback = debug_send_buffer;
seekfree_assistant_receive_callback = debug_read_ring_buffer;
+#endif
}break;
case SEEKFREE_ASSISTANT_WIRELESS_UART:
diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_menc15a.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_menc15a.c
new file mode 100644
index 0000000..faaeba2
--- /dev/null
+++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_menc15a.c
@@ -0,0 +1,188 @@
+/*********************************************************************************************************************
+* CYT2BL3 Opensourec Library 即( CYT2BL3 开源库)是一个基于官方 SDK 接口的第三方开源库
+* Copyright (c) 2022 SEEKFREE 逐飞科技
+*
+* 本文件是 CYT2BL3 开源库的一部分
+*
+* CYT2BL3 开源库 是免费软件
+* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
+* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
+*
+* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
+* 甚至没有隐含的适销性或适合特定用途的保证
+* 更多细节请参见 GPL
+*
+* 您应该在收到本开源库的同时收到一份 GPL 的副本
+* 如果没有,请参阅
+*
+* 额外注明:
+* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
+* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
+* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
+* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
+*
+* 文件名称 zf_device_menc15a
+* 公司名称 成都逐飞科技有限公司
+* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
+* 开发环境 IAR 9.40.1
+* 适用平台 CYT2BL3
+* 店铺链接 https://seekfree.taobao.com/
+*
+* 修改记录
+* 日期 作者 备注
+* 2024-11-19 pudding first version
+********************************************************************************************************************/
+/*********************************************************************************************************************
+* 接线定义:
+* ------------------------------------
+* 模块管脚 单片机管脚
+* // 硬件 SPI 引脚
+* SCL/SPC 查看 zf_device_menc15a.h 中 MENC15A_SPC_PIN 宏定义
+* SDA/DSI 查看 zf_device_menc15a.h 中 MENC15A_SDI_PIN 宏定义
+* SA0/SDO 查看 zf_device_menc15a.h 中 MENC15A_SDO_PIN 宏定义
+* CS 查看 zf_device_menc15a.h 中 MENC15A_CS_PIN 宏定义
+* VCC 3.3V电源
+* GND 电源地
+* 其余引脚悬空
+* ------------------------------------
+********************************************************************************************************************/
+
+#include "zf_common_debug.h"
+#include "zf_common_function.h"
+#include "zf_device_config.h"
+#include "zf_driver_delay.h"
+#include "zf_driver_gpio.h"
+#include "zf_driver_spi.h"
+
+#include "zf_device_menc15a.h"
+
+uint16 menc15a_absolute_data[2] = {0};
+
+int16 menc15a_absolute_offset_data[2] = {0};
+
+int16 menc15a_speed_data[2] = {0};
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 计算编码器旋转偏差
+// 参数说明 encoder_max 编码器精度 填写十进制数据
+// 参数说明 now_location 当前位置信息
+// 参数说明 last_location 上一次的位置信息
+// 返回参数 int32 计算的偏差值
+// 使用示例 magnetic_encoder_get_offset();
+// 备注信息
+//-------------------------------------------------------------------------------------------------------------------
+static int32 magnetic_encoder_get_offset (int32 encoder_max, int32 now_location, int32 last_location)
+{
+ int32 result_data = 0;
+
+ if((encoder_max / 2) < func_abs(now_location - last_location))
+ {
+ result_data = ((encoder_max / 2) < now_location ? (now_location - encoder_max - last_location) : (now_location + encoder_max - last_location));
+ }
+ else
+ {
+ result_data = (now_location - last_location);
+ }
+
+ return result_data;
+}
+
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 获取 MENC15A 磁编码器 的 绝对值 角度数据
+// 参数说明 menc15a_module 磁编码器 模块号
+// 返回参数 uint16 绝对值 角度数据
+// 使用示例 menc15a_1_get_absolute_data();
+// 备注信息 执行该函数后,可直接使用返回值 也可以通过查询对应变量获取结果
+//-------------------------------------------------------------------------------------------------------------------
+uint16 menc15a_get_absolute_data(menc15a_module_enum menc15a_module)
+{
+ uint16 read_data = 0;
+
+ uint16 data_last = menc15a_absolute_data[menc15a_module];
+
+ if(menc15a_module == menc15a_1_module)
+ {
+ MENC15A_1_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_1_SPI, 0x8021);
+
+ MENC15A_1_CS(1);
+ }
+ else
+ {
+ MENC15A_2_CS(0);
+
+ spi_write_8bit(MENC15A_2_SPI, 0x80);
+ spi_write_8bit(MENC15A_2_SPI, 0x21);
+ read_data = spi_read_8bit(MENC15A_2_SPI);
+ read_data = ((read_data << 8) | spi_read_8bit(MENC15A_2_SPI));
+
+ MENC15A_2_CS(1);
+ }
+
+ menc15a_absolute_data[menc15a_module] = (read_data & 0x7fff);
+
+ menc15a_absolute_offset_data[menc15a_module] = (int16)magnetic_encoder_get_offset(32768, menc15a_absolute_data[menc15a_module], data_last);
+
+ return menc15a_absolute_data[menc15a_module];
+}
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 获取 MENC15A 磁编码器 的 转速数据
+// 参数说明 menc15a_module 磁编码器 模块号
+// 返回参数 int16 转速数据(每秒旋转弧度 rad/s)
+// 使用示例 menc15a_1_get_speed_data();
+// 备注信息 执行该函数后,可直接使用返回值 也可以通过查询对应变量获取结果
+//-------------------------------------------------------------------------------------------------------------------
+int16 menc15a_get_speed_data(menc15a_module_enum menc15a_module)
+{
+ int16 read_data = 0;
+
+ if(menc15a_module == menc15a_1_module)
+ {
+ MENC15A_1_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_1_SPI, 0x8032);
+
+ MENC15A_1_CS(1);
+ }
+ else
+ {
+ MENC15A_2_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_2_SPI, 0x8032);
+
+ MENC15A_2_CS(1);
+ }
+
+ read_data = (read_data & 0x7fff);
+
+ if(read_data > 16384)
+ {
+ read_data = read_data - 32768;
+ }
+
+ menc15a_speed_data[menc15a_module] = (int16)((float)read_data * 1.917476f);
+
+ return menc15a_speed_data[menc15a_module];
+}
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 初始化 MENC15A
+// 参数说明 void
+// 返回参数 uint8 1-初始化失败 0-初始化成功
+// 使用示例 menc15a_init();
+// 备注信息
+//-------------------------------------------------------------------------------------------------------------------
+uint8 menc15a_init(void)
+{
+ spi_init(MENC15A_1_SPI, SPI_MODE1, MENC15A_1_SPI_SPEED, MENC15A_1_CLK_PIN, MENC15A_1_MOSI_PIN, MENC15A_1_MISO_PIN, SPI_CS_NULL); // 配置 MENC15A-1 的 SPI端口
+ gpio_init(MENC15A_1_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); // 配置 MENC15A-1 的 CS端口
+
+ spi_init(MENC15A_2_SPI, SPI_MODE1, MENC15A_2_SPI_SPEED, MENC15A_2_CLK_PIN, MENC15A_2_MOSI_PIN, MENC15A_2_MISO_PIN, SPI_CS_NULL); // 配置 MENC15A-2 的 SPI端口
+ gpio_init(MENC15A_2_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); // 配置 MENC15A-2 的 CS端口
+
+ return 0;
+}
+
diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_menc15a.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_menc15a.h
new file mode 100644
index 0000000..068d877
--- /dev/null
+++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_menc15a.h
@@ -0,0 +1,102 @@
+/*********************************************************************************************************************
+* CYT2BL3 Opensourec Library 即( CYT2BL3 开源库)是一个基于官方 SDK 接口的第三方开源库
+* Copyright (c) 2022 SEEKFREE 逐飞科技
+*
+* 本文件是 CYT2BL3 开源库的一部分
+*
+* CYT2BL3 开源库 是免费软件
+* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
+* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
+*
+* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
+* 甚至没有隐含的适销性或适合特定用途的保证
+* 更多细节请参见 GPL
+*
+* 您应该在收到本开源库的同时收到一份 GPL 的副本
+* 如果没有,请参阅
+*
+* 额外注明:
+* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
+* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
+* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
+* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
+*
+* 文件名称 zf_device_menc15a
+* 公司名称 成都逐飞科技有限公司
+* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
+* 开发环境 IAR 9.40.1
+* 适用平台 CYT2BL3
+* 店铺链接 https://seekfree.taobao.com/
+*
+* 修改记录
+* 日期 作者 备注
+* 2024-11-19 pudding first version
+********************************************************************************************************************/
+/*********************************************************************************************************************
+* 接线定义:
+* ------------------------------------
+* 模块管脚 单片机管脚
+* // 硬件 SPI 引脚
+* CLK 查看 zf_device_menc15a.h 中 MENC15A_CLK_PIN 宏定义
+* MOSI 查看 zf_device_menc15a.h 中 MENC15A_MOSI_PIN 宏定义
+* MISO 查看 zf_device_menc15a.h 中 MENC15A_MISO_PIN 宏定义
+* CS 查看 zf_device_menc15a.h 中 MENC15A_CS_PIN 宏定义
+* VCC 3.3V电源
+* GND 电源地
+* 其余引脚悬空
+* ------------------------------------
+********************************************************************************************************************/
+
+
+#ifndef _zf_device_menc15a_h_
+#define _zf_device_menc15a_h_
+
+#include "zf_common_typedef.h"
+
+//================================================定义 MENC15A 基本配置================================================
+
+//====================================================硬件 SPI 驱动====================================================
+#define MENC15A_1_SPI_SPEED (20 * 1000 * 1000) // 磁编码器1 硬件 SPI 速率
+#define MENC15A_1_SPI (SPI_0 ) // 磁编码器1 硬件 SPI 号
+#define MENC15A_1_CLK_PIN (SPI0_SCLK_P20_11) // 磁编码器1 硬件 SPI SCK 引脚
+#define MENC15A_1_MOSI_PIN (SPI0_MOSI_P20_14) // 磁编码器1 硬件 SPI MOSI 引脚
+#define MENC15A_1_MISO_PIN (SPI0_MISO_P20_12) // 磁编码器1 硬件 SPI MISO 引脚
+#define MENC15A_1_CS_PIN (P20_13) // 磁编码器1 CS 片选引脚
+#define MENC15A_1_CS(x) ((x) ? (gpio_high(MENC15A_1_CS_PIN)) : (gpio_low(MENC15A_1_CS_PIN)))
+
+
+#define MENC15A_2_SPI_SPEED (20 * 1000 * 1000) // 磁编码器2 硬件 SPI 速率
+#define MENC15A_2_SPI (SPI_0 ) // 磁编码器2 硬件 SPI 号
+#define MENC15A_2_CLK_PIN (SPI0_SCLK_P20_11 ) // 磁编码器2 硬件 SPI SCK 引脚
+#define MENC15A_2_MOSI_PIN (SPI0_MOSI_P20_14 ) // 磁编码器2 硬件 SPI MOSI 引脚
+#define MENC15A_2_MISO_PIN (SPI0_MISO_P20_12 ) // 磁编码器2 硬件 SPI MISO 引脚
+#define MENC15A_2_CS_PIN (P20_15) // 磁编码器2 CS 片选引脚
+#define MENC15A_2_CS(x) ((x) ? (gpio_high(MENC15A_2_CS_PIN)) : (gpio_low(MENC15A_2_CS_PIN)))
+
+//====================================================硬件 SPI 驱动====================================================
+
+// 枚举磁编码模块
+typedef enum
+{
+ menc15a_1_module,
+ menc15a_2_module,
+
+}menc15a_module_enum;
+
+//================================================定义 MENC15A 基本配置================================================
+
+
+extern uint16 menc15a_absolute_data[2];
+
+extern int16 menc15a_absolute_offset_data[2];
+
+extern int16 menc15a_speed_data[2];
+
+
+uint16 menc15a_get_absolute_data(menc15a_module_enum menc15a_module);
+int16 menc15a_get_speed_data(menc15a_module_enum menc15a_module);
+
+uint8 menc15a_init(void);
+
+
+#endif
diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_uart_receiver.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_uart_receiver.c
index 3ebb3bd..ade446d 100644
--- a/Example/E02_uart_demo/libraries/zf_device/zf_device_uart_receiver.c
+++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_uart_receiver.c
@@ -91,7 +91,7 @@ static void uart_receiver_analysis (uart_receiver_struct *remote_data,uint8 * bu
remote_data->channel[num++] = (buffer[5] >> 1 | buffer[6] << 7 ) & 0x07FF;
remote_data->channel[num++] = (buffer[6] >> 4 | buffer[7] << 4 ) & 0x07FF;
remote_data->channel[num++] = (buffer[7] >> 7 | buffer[8] << 1 | buffer[9] << 9 ) & 0x07FF;
- remote_data->state = (SBUS_NORMAL_STATE == buffer[23]) ? 1 : 0;
+ remote_data->state = (SBUS_ABNORMAL_STATE == (buffer[23] & SBUS_ABNORMAL_STATE)) ? 0 : 1;
uart_receiver.finsh_flag = 1;
}
diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_uart_receiver.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_uart_receiver.h
index 948ab2f..6498dcb 100644
--- a/Example/E02_uart_demo/libraries/zf_device/zf_device_uart_receiver.h
+++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_uart_receiver.h
@@ -55,8 +55,7 @@
#define REV_DATA_LEN ( 25 ) // SBUS帧长
#define FRAME_STAR ( 0X0F ) // 帧头信息
#define FRAME_END ( 0X00 ) // 帧尾信息
-#define SBUS_NORMAL_STATE ( 0X03 ) // 正常状态
-#define SBUS_ABNORMAL_STATE ( 0X0F ) // 失控状态
+#define SBUS_ABNORMAL_STATE ( 0X04 ) // 失控状态
typedef struct
{
diff --git a/Example/E02_uart_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt b/Example/E02_uart_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
index 1c96965..40d9e28 100644
--- a/Example/E02_uart_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
+++ b/Example/E02_uart_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
@@ -88,6 +88,8 @@ zf_device_uart_receiver.h SUBS
zf_device_absolute_encoder.h 360° 位置传感器 绝对式迷你 mini 编码器 分辨率:0.088°
+zf_device_menc15a.h 15位高精度磁编码器驱动 位置式
+
zf_device_gnss.h GPS 及 RTK 定位模块 双频高精度定位模块 亚米级定位
zf_device_key.h GPIO 按键驱动 用于检测主板按键状态
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 f817dd9..d74841c 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
@@ -766,11 +766,11 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name
IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕 首次发送数据 此时接收缓冲区无数据
IfxQspi_writeTransmitFifo(moudle, (uint8)(register_name & 0x00FF)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 1); // 等待接收完毕 再次发送数据 此时接收缓冲区有1个数据
spi_clear_fifo(moudle); // 清除接收缓存区
@@ -818,11 +818,11 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name,
IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕 首次发送数据 此时接收缓冲区无数据
IfxQspi_writeTransmitFifo(moudle, (uint8)(register_name & 0x00FF)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 1); // 等待接收完毕 再次发送数据 此时接收缓冲区有1个数据
spi_clear_fifo(moudle); // 清除接收缓存区
diff --git a/Example/E03_adc_demo/libraries/doc/version.txt b/Example/E03_adc_demo/libraries/doc/version.txt
index f45bf81..4df6214 100644
--- a/Example/E03_adc_demo/libraries/doc/version.txt
+++ b/Example/E03_adc_demo/libraries/doc/version.txt
@@ -1,3 +1,7 @@
+V3.3.2
+ 新增zf_device_menc15a磁编码器外设驱动
+ 更改uart接收机部分语句
+ 修正SPI的16位通讯错位问题
V3.3.1
移除正交编码器的断言检测
新增重命名工程工具
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 3a140e3..c8f75f2 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
@@ -93,6 +93,7 @@
#include "zf_device_ips114.h"
#include "zf_device_ips200.h"
#include "zf_device_key.h"
+#include "zf_device_menc15a.h"
#include "zf_device_mpu6050.h"
#include "zf_device_mt9v03x.h"
#include "zf_device_oled.h"
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 cc42e43..adfc4a3 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
@@ -91,8 +91,10 @@ ZF_WEAK void seekfree_assistant_interface_init (seekfree_assistant_transfer_devi
{
case SEEKFREE_ASSISTANT_DEBUG_UART:
{
+#if DEBUG_UART_USE_INTERRUPT == 1
seekfree_assistant_transfer_callback = debug_send_buffer;
seekfree_assistant_receive_callback = debug_read_ring_buffer;
+#endif
}break;
case SEEKFREE_ASSISTANT_WIRELESS_UART:
diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_menc15a.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_menc15a.c
new file mode 100644
index 0000000..faaeba2
--- /dev/null
+++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_menc15a.c
@@ -0,0 +1,188 @@
+/*********************************************************************************************************************
+* CYT2BL3 Opensourec Library 即( CYT2BL3 开源库)是一个基于官方 SDK 接口的第三方开源库
+* Copyright (c) 2022 SEEKFREE 逐飞科技
+*
+* 本文件是 CYT2BL3 开源库的一部分
+*
+* CYT2BL3 开源库 是免费软件
+* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
+* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
+*
+* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
+* 甚至没有隐含的适销性或适合特定用途的保证
+* 更多细节请参见 GPL
+*
+* 您应该在收到本开源库的同时收到一份 GPL 的副本
+* 如果没有,请参阅
+*
+* 额外注明:
+* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
+* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
+* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
+* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
+*
+* 文件名称 zf_device_menc15a
+* 公司名称 成都逐飞科技有限公司
+* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
+* 开发环境 IAR 9.40.1
+* 适用平台 CYT2BL3
+* 店铺链接 https://seekfree.taobao.com/
+*
+* 修改记录
+* 日期 作者 备注
+* 2024-11-19 pudding first version
+********************************************************************************************************************/
+/*********************************************************************************************************************
+* 接线定义:
+* ------------------------------------
+* 模块管脚 单片机管脚
+* // 硬件 SPI 引脚
+* SCL/SPC 查看 zf_device_menc15a.h 中 MENC15A_SPC_PIN 宏定义
+* SDA/DSI 查看 zf_device_menc15a.h 中 MENC15A_SDI_PIN 宏定义
+* SA0/SDO 查看 zf_device_menc15a.h 中 MENC15A_SDO_PIN 宏定义
+* CS 查看 zf_device_menc15a.h 中 MENC15A_CS_PIN 宏定义
+* VCC 3.3V电源
+* GND 电源地
+* 其余引脚悬空
+* ------------------------------------
+********************************************************************************************************************/
+
+#include "zf_common_debug.h"
+#include "zf_common_function.h"
+#include "zf_device_config.h"
+#include "zf_driver_delay.h"
+#include "zf_driver_gpio.h"
+#include "zf_driver_spi.h"
+
+#include "zf_device_menc15a.h"
+
+uint16 menc15a_absolute_data[2] = {0};
+
+int16 menc15a_absolute_offset_data[2] = {0};
+
+int16 menc15a_speed_data[2] = {0};
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 计算编码器旋转偏差
+// 参数说明 encoder_max 编码器精度 填写十进制数据
+// 参数说明 now_location 当前位置信息
+// 参数说明 last_location 上一次的位置信息
+// 返回参数 int32 计算的偏差值
+// 使用示例 magnetic_encoder_get_offset();
+// 备注信息
+//-------------------------------------------------------------------------------------------------------------------
+static int32 magnetic_encoder_get_offset (int32 encoder_max, int32 now_location, int32 last_location)
+{
+ int32 result_data = 0;
+
+ if((encoder_max / 2) < func_abs(now_location - last_location))
+ {
+ result_data = ((encoder_max / 2) < now_location ? (now_location - encoder_max - last_location) : (now_location + encoder_max - last_location));
+ }
+ else
+ {
+ result_data = (now_location - last_location);
+ }
+
+ return result_data;
+}
+
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 获取 MENC15A 磁编码器 的 绝对值 角度数据
+// 参数说明 menc15a_module 磁编码器 模块号
+// 返回参数 uint16 绝对值 角度数据
+// 使用示例 menc15a_1_get_absolute_data();
+// 备注信息 执行该函数后,可直接使用返回值 也可以通过查询对应变量获取结果
+//-------------------------------------------------------------------------------------------------------------------
+uint16 menc15a_get_absolute_data(menc15a_module_enum menc15a_module)
+{
+ uint16 read_data = 0;
+
+ uint16 data_last = menc15a_absolute_data[menc15a_module];
+
+ if(menc15a_module == menc15a_1_module)
+ {
+ MENC15A_1_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_1_SPI, 0x8021);
+
+ MENC15A_1_CS(1);
+ }
+ else
+ {
+ MENC15A_2_CS(0);
+
+ spi_write_8bit(MENC15A_2_SPI, 0x80);
+ spi_write_8bit(MENC15A_2_SPI, 0x21);
+ read_data = spi_read_8bit(MENC15A_2_SPI);
+ read_data = ((read_data << 8) | spi_read_8bit(MENC15A_2_SPI));
+
+ MENC15A_2_CS(1);
+ }
+
+ menc15a_absolute_data[menc15a_module] = (read_data & 0x7fff);
+
+ menc15a_absolute_offset_data[menc15a_module] = (int16)magnetic_encoder_get_offset(32768, menc15a_absolute_data[menc15a_module], data_last);
+
+ return menc15a_absolute_data[menc15a_module];
+}
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 获取 MENC15A 磁编码器 的 转速数据
+// 参数说明 menc15a_module 磁编码器 模块号
+// 返回参数 int16 转速数据(每秒旋转弧度 rad/s)
+// 使用示例 menc15a_1_get_speed_data();
+// 备注信息 执行该函数后,可直接使用返回值 也可以通过查询对应变量获取结果
+//-------------------------------------------------------------------------------------------------------------------
+int16 menc15a_get_speed_data(menc15a_module_enum menc15a_module)
+{
+ int16 read_data = 0;
+
+ if(menc15a_module == menc15a_1_module)
+ {
+ MENC15A_1_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_1_SPI, 0x8032);
+
+ MENC15A_1_CS(1);
+ }
+ else
+ {
+ MENC15A_2_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_2_SPI, 0x8032);
+
+ MENC15A_2_CS(1);
+ }
+
+ read_data = (read_data & 0x7fff);
+
+ if(read_data > 16384)
+ {
+ read_data = read_data - 32768;
+ }
+
+ menc15a_speed_data[menc15a_module] = (int16)((float)read_data * 1.917476f);
+
+ return menc15a_speed_data[menc15a_module];
+}
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 初始化 MENC15A
+// 参数说明 void
+// 返回参数 uint8 1-初始化失败 0-初始化成功
+// 使用示例 menc15a_init();
+// 备注信息
+//-------------------------------------------------------------------------------------------------------------------
+uint8 menc15a_init(void)
+{
+ spi_init(MENC15A_1_SPI, SPI_MODE1, MENC15A_1_SPI_SPEED, MENC15A_1_CLK_PIN, MENC15A_1_MOSI_PIN, MENC15A_1_MISO_PIN, SPI_CS_NULL); // 配置 MENC15A-1 的 SPI端口
+ gpio_init(MENC15A_1_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); // 配置 MENC15A-1 的 CS端口
+
+ spi_init(MENC15A_2_SPI, SPI_MODE1, MENC15A_2_SPI_SPEED, MENC15A_2_CLK_PIN, MENC15A_2_MOSI_PIN, MENC15A_2_MISO_PIN, SPI_CS_NULL); // 配置 MENC15A-2 的 SPI端口
+ gpio_init(MENC15A_2_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); // 配置 MENC15A-2 的 CS端口
+
+ return 0;
+}
+
diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_menc15a.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_menc15a.h
new file mode 100644
index 0000000..068d877
--- /dev/null
+++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_menc15a.h
@@ -0,0 +1,102 @@
+/*********************************************************************************************************************
+* CYT2BL3 Opensourec Library 即( CYT2BL3 开源库)是一个基于官方 SDK 接口的第三方开源库
+* Copyright (c) 2022 SEEKFREE 逐飞科技
+*
+* 本文件是 CYT2BL3 开源库的一部分
+*
+* CYT2BL3 开源库 是免费软件
+* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
+* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
+*
+* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
+* 甚至没有隐含的适销性或适合特定用途的保证
+* 更多细节请参见 GPL
+*
+* 您应该在收到本开源库的同时收到一份 GPL 的副本
+* 如果没有,请参阅
+*
+* 额外注明:
+* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
+* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
+* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
+* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
+*
+* 文件名称 zf_device_menc15a
+* 公司名称 成都逐飞科技有限公司
+* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
+* 开发环境 IAR 9.40.1
+* 适用平台 CYT2BL3
+* 店铺链接 https://seekfree.taobao.com/
+*
+* 修改记录
+* 日期 作者 备注
+* 2024-11-19 pudding first version
+********************************************************************************************************************/
+/*********************************************************************************************************************
+* 接线定义:
+* ------------------------------------
+* 模块管脚 单片机管脚
+* // 硬件 SPI 引脚
+* CLK 查看 zf_device_menc15a.h 中 MENC15A_CLK_PIN 宏定义
+* MOSI 查看 zf_device_menc15a.h 中 MENC15A_MOSI_PIN 宏定义
+* MISO 查看 zf_device_menc15a.h 中 MENC15A_MISO_PIN 宏定义
+* CS 查看 zf_device_menc15a.h 中 MENC15A_CS_PIN 宏定义
+* VCC 3.3V电源
+* GND 电源地
+* 其余引脚悬空
+* ------------------------------------
+********************************************************************************************************************/
+
+
+#ifndef _zf_device_menc15a_h_
+#define _zf_device_menc15a_h_
+
+#include "zf_common_typedef.h"
+
+//================================================定义 MENC15A 基本配置================================================
+
+//====================================================硬件 SPI 驱动====================================================
+#define MENC15A_1_SPI_SPEED (20 * 1000 * 1000) // 磁编码器1 硬件 SPI 速率
+#define MENC15A_1_SPI (SPI_0 ) // 磁编码器1 硬件 SPI 号
+#define MENC15A_1_CLK_PIN (SPI0_SCLK_P20_11) // 磁编码器1 硬件 SPI SCK 引脚
+#define MENC15A_1_MOSI_PIN (SPI0_MOSI_P20_14) // 磁编码器1 硬件 SPI MOSI 引脚
+#define MENC15A_1_MISO_PIN (SPI0_MISO_P20_12) // 磁编码器1 硬件 SPI MISO 引脚
+#define MENC15A_1_CS_PIN (P20_13) // 磁编码器1 CS 片选引脚
+#define MENC15A_1_CS(x) ((x) ? (gpio_high(MENC15A_1_CS_PIN)) : (gpio_low(MENC15A_1_CS_PIN)))
+
+
+#define MENC15A_2_SPI_SPEED (20 * 1000 * 1000) // 磁编码器2 硬件 SPI 速率
+#define MENC15A_2_SPI (SPI_0 ) // 磁编码器2 硬件 SPI 号
+#define MENC15A_2_CLK_PIN (SPI0_SCLK_P20_11 ) // 磁编码器2 硬件 SPI SCK 引脚
+#define MENC15A_2_MOSI_PIN (SPI0_MOSI_P20_14 ) // 磁编码器2 硬件 SPI MOSI 引脚
+#define MENC15A_2_MISO_PIN (SPI0_MISO_P20_12 ) // 磁编码器2 硬件 SPI MISO 引脚
+#define MENC15A_2_CS_PIN (P20_15) // 磁编码器2 CS 片选引脚
+#define MENC15A_2_CS(x) ((x) ? (gpio_high(MENC15A_2_CS_PIN)) : (gpio_low(MENC15A_2_CS_PIN)))
+
+//====================================================硬件 SPI 驱动====================================================
+
+// 枚举磁编码模块
+typedef enum
+{
+ menc15a_1_module,
+ menc15a_2_module,
+
+}menc15a_module_enum;
+
+//================================================定义 MENC15A 基本配置================================================
+
+
+extern uint16 menc15a_absolute_data[2];
+
+extern int16 menc15a_absolute_offset_data[2];
+
+extern int16 menc15a_speed_data[2];
+
+
+uint16 menc15a_get_absolute_data(menc15a_module_enum menc15a_module);
+int16 menc15a_get_speed_data(menc15a_module_enum menc15a_module);
+
+uint8 menc15a_init(void);
+
+
+#endif
diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_uart_receiver.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_uart_receiver.c
index 3ebb3bd..ade446d 100644
--- a/Example/E03_adc_demo/libraries/zf_device/zf_device_uart_receiver.c
+++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_uart_receiver.c
@@ -91,7 +91,7 @@ static void uart_receiver_analysis (uart_receiver_struct *remote_data,uint8 * bu
remote_data->channel[num++] = (buffer[5] >> 1 | buffer[6] << 7 ) & 0x07FF;
remote_data->channel[num++] = (buffer[6] >> 4 | buffer[7] << 4 ) & 0x07FF;
remote_data->channel[num++] = (buffer[7] >> 7 | buffer[8] << 1 | buffer[9] << 9 ) & 0x07FF;
- remote_data->state = (SBUS_NORMAL_STATE == buffer[23]) ? 1 : 0;
+ remote_data->state = (SBUS_ABNORMAL_STATE == (buffer[23] & SBUS_ABNORMAL_STATE)) ? 0 : 1;
uart_receiver.finsh_flag = 1;
}
diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_uart_receiver.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_uart_receiver.h
index 948ab2f..6498dcb 100644
--- a/Example/E03_adc_demo/libraries/zf_device/zf_device_uart_receiver.h
+++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_uart_receiver.h
@@ -55,8 +55,7 @@
#define REV_DATA_LEN ( 25 ) // SBUS帧长
#define FRAME_STAR ( 0X0F ) // 帧头信息
#define FRAME_END ( 0X00 ) // 帧尾信息
-#define SBUS_NORMAL_STATE ( 0X03 ) // 正常状态
-#define SBUS_ABNORMAL_STATE ( 0X0F ) // 失控状态
+#define SBUS_ABNORMAL_STATE ( 0X04 ) // 失控状态
typedef struct
{
diff --git a/Example/E03_adc_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt b/Example/E03_adc_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
index 1c96965..40d9e28 100644
--- a/Example/E03_adc_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
+++ b/Example/E03_adc_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
@@ -88,6 +88,8 @@ zf_device_uart_receiver.h SUBS
zf_device_absolute_encoder.h 360° 位置传感器 绝对式迷你 mini 编码器 分辨率:0.088°
+zf_device_menc15a.h 15位高精度磁编码器驱动 位置式
+
zf_device_gnss.h GPS 及 RTK 定位模块 双频高精度定位模块 亚米级定位
zf_device_key.h GPIO 按键驱动 用于检测主板按键状态
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 f817dd9..d74841c 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
@@ -766,11 +766,11 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name
IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕 首次发送数据 此时接收缓冲区无数据
IfxQspi_writeTransmitFifo(moudle, (uint8)(register_name & 0x00FF)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 1); // 等待接收完毕 再次发送数据 此时接收缓冲区有1个数据
spi_clear_fifo(moudle); // 清除接收缓存区
@@ -818,11 +818,11 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name,
IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕 首次发送数据 此时接收缓冲区无数据
IfxQspi_writeTransmitFifo(moudle, (uint8)(register_name & 0x00FF)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 1); // 等待接收完毕 再次发送数据 此时接收缓冲区有1个数据
spi_clear_fifo(moudle); // 清除接收缓存区
diff --git a/Example/E04_pwm_demo/libraries/doc/version.txt b/Example/E04_pwm_demo/libraries/doc/version.txt
index f45bf81..4df6214 100644
--- a/Example/E04_pwm_demo/libraries/doc/version.txt
+++ b/Example/E04_pwm_demo/libraries/doc/version.txt
@@ -1,3 +1,7 @@
+V3.3.2
+ 新增zf_device_menc15a磁编码器外设驱动
+ 更改uart接收机部分语句
+ 修正SPI的16位通讯错位问题
V3.3.1
移除正交编码器的断言检测
新增重命名工程工具
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 3a140e3..c8f75f2 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
@@ -93,6 +93,7 @@
#include "zf_device_ips114.h"
#include "zf_device_ips200.h"
#include "zf_device_key.h"
+#include "zf_device_menc15a.h"
#include "zf_device_mpu6050.h"
#include "zf_device_mt9v03x.h"
#include "zf_device_oled.h"
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 cc42e43..adfc4a3 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
@@ -91,8 +91,10 @@ ZF_WEAK void seekfree_assistant_interface_init (seekfree_assistant_transfer_devi
{
case SEEKFREE_ASSISTANT_DEBUG_UART:
{
+#if DEBUG_UART_USE_INTERRUPT == 1
seekfree_assistant_transfer_callback = debug_send_buffer;
seekfree_assistant_receive_callback = debug_read_ring_buffer;
+#endif
}break;
case SEEKFREE_ASSISTANT_WIRELESS_UART:
diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_menc15a.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_menc15a.c
new file mode 100644
index 0000000..faaeba2
--- /dev/null
+++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_menc15a.c
@@ -0,0 +1,188 @@
+/*********************************************************************************************************************
+* CYT2BL3 Opensourec Library 即( CYT2BL3 开源库)是一个基于官方 SDK 接口的第三方开源库
+* Copyright (c) 2022 SEEKFREE 逐飞科技
+*
+* 本文件是 CYT2BL3 开源库的一部分
+*
+* CYT2BL3 开源库 是免费软件
+* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
+* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
+*
+* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
+* 甚至没有隐含的适销性或适合特定用途的保证
+* 更多细节请参见 GPL
+*
+* 您应该在收到本开源库的同时收到一份 GPL 的副本
+* 如果没有,请参阅
+*
+* 额外注明:
+* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
+* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
+* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
+* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
+*
+* 文件名称 zf_device_menc15a
+* 公司名称 成都逐飞科技有限公司
+* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
+* 开发环境 IAR 9.40.1
+* 适用平台 CYT2BL3
+* 店铺链接 https://seekfree.taobao.com/
+*
+* 修改记录
+* 日期 作者 备注
+* 2024-11-19 pudding first version
+********************************************************************************************************************/
+/*********************************************************************************************************************
+* 接线定义:
+* ------------------------------------
+* 模块管脚 单片机管脚
+* // 硬件 SPI 引脚
+* SCL/SPC 查看 zf_device_menc15a.h 中 MENC15A_SPC_PIN 宏定义
+* SDA/DSI 查看 zf_device_menc15a.h 中 MENC15A_SDI_PIN 宏定义
+* SA0/SDO 查看 zf_device_menc15a.h 中 MENC15A_SDO_PIN 宏定义
+* CS 查看 zf_device_menc15a.h 中 MENC15A_CS_PIN 宏定义
+* VCC 3.3V电源
+* GND 电源地
+* 其余引脚悬空
+* ------------------------------------
+********************************************************************************************************************/
+
+#include "zf_common_debug.h"
+#include "zf_common_function.h"
+#include "zf_device_config.h"
+#include "zf_driver_delay.h"
+#include "zf_driver_gpio.h"
+#include "zf_driver_spi.h"
+
+#include "zf_device_menc15a.h"
+
+uint16 menc15a_absolute_data[2] = {0};
+
+int16 menc15a_absolute_offset_data[2] = {0};
+
+int16 menc15a_speed_data[2] = {0};
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 计算编码器旋转偏差
+// 参数说明 encoder_max 编码器精度 填写十进制数据
+// 参数说明 now_location 当前位置信息
+// 参数说明 last_location 上一次的位置信息
+// 返回参数 int32 计算的偏差值
+// 使用示例 magnetic_encoder_get_offset();
+// 备注信息
+//-------------------------------------------------------------------------------------------------------------------
+static int32 magnetic_encoder_get_offset (int32 encoder_max, int32 now_location, int32 last_location)
+{
+ int32 result_data = 0;
+
+ if((encoder_max / 2) < func_abs(now_location - last_location))
+ {
+ result_data = ((encoder_max / 2) < now_location ? (now_location - encoder_max - last_location) : (now_location + encoder_max - last_location));
+ }
+ else
+ {
+ result_data = (now_location - last_location);
+ }
+
+ return result_data;
+}
+
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 获取 MENC15A 磁编码器 的 绝对值 角度数据
+// 参数说明 menc15a_module 磁编码器 模块号
+// 返回参数 uint16 绝对值 角度数据
+// 使用示例 menc15a_1_get_absolute_data();
+// 备注信息 执行该函数后,可直接使用返回值 也可以通过查询对应变量获取结果
+//-------------------------------------------------------------------------------------------------------------------
+uint16 menc15a_get_absolute_data(menc15a_module_enum menc15a_module)
+{
+ uint16 read_data = 0;
+
+ uint16 data_last = menc15a_absolute_data[menc15a_module];
+
+ if(menc15a_module == menc15a_1_module)
+ {
+ MENC15A_1_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_1_SPI, 0x8021);
+
+ MENC15A_1_CS(1);
+ }
+ else
+ {
+ MENC15A_2_CS(0);
+
+ spi_write_8bit(MENC15A_2_SPI, 0x80);
+ spi_write_8bit(MENC15A_2_SPI, 0x21);
+ read_data = spi_read_8bit(MENC15A_2_SPI);
+ read_data = ((read_data << 8) | spi_read_8bit(MENC15A_2_SPI));
+
+ MENC15A_2_CS(1);
+ }
+
+ menc15a_absolute_data[menc15a_module] = (read_data & 0x7fff);
+
+ menc15a_absolute_offset_data[menc15a_module] = (int16)magnetic_encoder_get_offset(32768, menc15a_absolute_data[menc15a_module], data_last);
+
+ return menc15a_absolute_data[menc15a_module];
+}
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 获取 MENC15A 磁编码器 的 转速数据
+// 参数说明 menc15a_module 磁编码器 模块号
+// 返回参数 int16 转速数据(每秒旋转弧度 rad/s)
+// 使用示例 menc15a_1_get_speed_data();
+// 备注信息 执行该函数后,可直接使用返回值 也可以通过查询对应变量获取结果
+//-------------------------------------------------------------------------------------------------------------------
+int16 menc15a_get_speed_data(menc15a_module_enum menc15a_module)
+{
+ int16 read_data = 0;
+
+ if(menc15a_module == menc15a_1_module)
+ {
+ MENC15A_1_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_1_SPI, 0x8032);
+
+ MENC15A_1_CS(1);
+ }
+ else
+ {
+ MENC15A_2_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_2_SPI, 0x8032);
+
+ MENC15A_2_CS(1);
+ }
+
+ read_data = (read_data & 0x7fff);
+
+ if(read_data > 16384)
+ {
+ read_data = read_data - 32768;
+ }
+
+ menc15a_speed_data[menc15a_module] = (int16)((float)read_data * 1.917476f);
+
+ return menc15a_speed_data[menc15a_module];
+}
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 初始化 MENC15A
+// 参数说明 void
+// 返回参数 uint8 1-初始化失败 0-初始化成功
+// 使用示例 menc15a_init();
+// 备注信息
+//-------------------------------------------------------------------------------------------------------------------
+uint8 menc15a_init(void)
+{
+ spi_init(MENC15A_1_SPI, SPI_MODE1, MENC15A_1_SPI_SPEED, MENC15A_1_CLK_PIN, MENC15A_1_MOSI_PIN, MENC15A_1_MISO_PIN, SPI_CS_NULL); // 配置 MENC15A-1 的 SPI端口
+ gpio_init(MENC15A_1_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); // 配置 MENC15A-1 的 CS端口
+
+ spi_init(MENC15A_2_SPI, SPI_MODE1, MENC15A_2_SPI_SPEED, MENC15A_2_CLK_PIN, MENC15A_2_MOSI_PIN, MENC15A_2_MISO_PIN, SPI_CS_NULL); // 配置 MENC15A-2 的 SPI端口
+ gpio_init(MENC15A_2_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); // 配置 MENC15A-2 的 CS端口
+
+ return 0;
+}
+
diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_menc15a.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_menc15a.h
new file mode 100644
index 0000000..068d877
--- /dev/null
+++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_menc15a.h
@@ -0,0 +1,102 @@
+/*********************************************************************************************************************
+* CYT2BL3 Opensourec Library 即( CYT2BL3 开源库)是一个基于官方 SDK 接口的第三方开源库
+* Copyright (c) 2022 SEEKFREE 逐飞科技
+*
+* 本文件是 CYT2BL3 开源库的一部分
+*
+* CYT2BL3 开源库 是免费软件
+* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
+* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
+*
+* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
+* 甚至没有隐含的适销性或适合特定用途的保证
+* 更多细节请参见 GPL
+*
+* 您应该在收到本开源库的同时收到一份 GPL 的副本
+* 如果没有,请参阅
+*
+* 额外注明:
+* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
+* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
+* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
+* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
+*
+* 文件名称 zf_device_menc15a
+* 公司名称 成都逐飞科技有限公司
+* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
+* 开发环境 IAR 9.40.1
+* 适用平台 CYT2BL3
+* 店铺链接 https://seekfree.taobao.com/
+*
+* 修改记录
+* 日期 作者 备注
+* 2024-11-19 pudding first version
+********************************************************************************************************************/
+/*********************************************************************************************************************
+* 接线定义:
+* ------------------------------------
+* 模块管脚 单片机管脚
+* // 硬件 SPI 引脚
+* CLK 查看 zf_device_menc15a.h 中 MENC15A_CLK_PIN 宏定义
+* MOSI 查看 zf_device_menc15a.h 中 MENC15A_MOSI_PIN 宏定义
+* MISO 查看 zf_device_menc15a.h 中 MENC15A_MISO_PIN 宏定义
+* CS 查看 zf_device_menc15a.h 中 MENC15A_CS_PIN 宏定义
+* VCC 3.3V电源
+* GND 电源地
+* 其余引脚悬空
+* ------------------------------------
+********************************************************************************************************************/
+
+
+#ifndef _zf_device_menc15a_h_
+#define _zf_device_menc15a_h_
+
+#include "zf_common_typedef.h"
+
+//================================================定义 MENC15A 基本配置================================================
+
+//====================================================硬件 SPI 驱动====================================================
+#define MENC15A_1_SPI_SPEED (20 * 1000 * 1000) // 磁编码器1 硬件 SPI 速率
+#define MENC15A_1_SPI (SPI_0 ) // 磁编码器1 硬件 SPI 号
+#define MENC15A_1_CLK_PIN (SPI0_SCLK_P20_11) // 磁编码器1 硬件 SPI SCK 引脚
+#define MENC15A_1_MOSI_PIN (SPI0_MOSI_P20_14) // 磁编码器1 硬件 SPI MOSI 引脚
+#define MENC15A_1_MISO_PIN (SPI0_MISO_P20_12) // 磁编码器1 硬件 SPI MISO 引脚
+#define MENC15A_1_CS_PIN (P20_13) // 磁编码器1 CS 片选引脚
+#define MENC15A_1_CS(x) ((x) ? (gpio_high(MENC15A_1_CS_PIN)) : (gpio_low(MENC15A_1_CS_PIN)))
+
+
+#define MENC15A_2_SPI_SPEED (20 * 1000 * 1000) // 磁编码器2 硬件 SPI 速率
+#define MENC15A_2_SPI (SPI_0 ) // 磁编码器2 硬件 SPI 号
+#define MENC15A_2_CLK_PIN (SPI0_SCLK_P20_11 ) // 磁编码器2 硬件 SPI SCK 引脚
+#define MENC15A_2_MOSI_PIN (SPI0_MOSI_P20_14 ) // 磁编码器2 硬件 SPI MOSI 引脚
+#define MENC15A_2_MISO_PIN (SPI0_MISO_P20_12 ) // 磁编码器2 硬件 SPI MISO 引脚
+#define MENC15A_2_CS_PIN (P20_15) // 磁编码器2 CS 片选引脚
+#define MENC15A_2_CS(x) ((x) ? (gpio_high(MENC15A_2_CS_PIN)) : (gpio_low(MENC15A_2_CS_PIN)))
+
+//====================================================硬件 SPI 驱动====================================================
+
+// 枚举磁编码模块
+typedef enum
+{
+ menc15a_1_module,
+ menc15a_2_module,
+
+}menc15a_module_enum;
+
+//================================================定义 MENC15A 基本配置================================================
+
+
+extern uint16 menc15a_absolute_data[2];
+
+extern int16 menc15a_absolute_offset_data[2];
+
+extern int16 menc15a_speed_data[2];
+
+
+uint16 menc15a_get_absolute_data(menc15a_module_enum menc15a_module);
+int16 menc15a_get_speed_data(menc15a_module_enum menc15a_module);
+
+uint8 menc15a_init(void);
+
+
+#endif
diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_uart_receiver.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_uart_receiver.c
index 3ebb3bd..ade446d 100644
--- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_uart_receiver.c
+++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_uart_receiver.c
@@ -91,7 +91,7 @@ static void uart_receiver_analysis (uart_receiver_struct *remote_data,uint8 * bu
remote_data->channel[num++] = (buffer[5] >> 1 | buffer[6] << 7 ) & 0x07FF;
remote_data->channel[num++] = (buffer[6] >> 4 | buffer[7] << 4 ) & 0x07FF;
remote_data->channel[num++] = (buffer[7] >> 7 | buffer[8] << 1 | buffer[9] << 9 ) & 0x07FF;
- remote_data->state = (SBUS_NORMAL_STATE == buffer[23]) ? 1 : 0;
+ remote_data->state = (SBUS_ABNORMAL_STATE == (buffer[23] & SBUS_ABNORMAL_STATE)) ? 0 : 1;
uart_receiver.finsh_flag = 1;
}
diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_uart_receiver.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_uart_receiver.h
index 948ab2f..6498dcb 100644
--- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_uart_receiver.h
+++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_uart_receiver.h
@@ -55,8 +55,7 @@
#define REV_DATA_LEN ( 25 ) // SBUS帧长
#define FRAME_STAR ( 0X0F ) // 帧头信息
#define FRAME_END ( 0X00 ) // 帧尾信息
-#define SBUS_NORMAL_STATE ( 0X03 ) // 正常状态
-#define SBUS_ABNORMAL_STATE ( 0X0F ) // 失控状态
+#define SBUS_ABNORMAL_STATE ( 0X04 ) // 失控状态
typedef struct
{
diff --git a/Example/E04_pwm_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt b/Example/E04_pwm_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
index 1c96965..40d9e28 100644
--- a/Example/E04_pwm_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
+++ b/Example/E04_pwm_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
@@ -88,6 +88,8 @@ zf_device_uart_receiver.h SUBS
zf_device_absolute_encoder.h 360° 位置传感器 绝对式迷你 mini 编码器 分辨率:0.088°
+zf_device_menc15a.h 15位高精度磁编码器驱动 位置式
+
zf_device_gnss.h GPS 及 RTK 定位模块 双频高精度定位模块 亚米级定位
zf_device_key.h GPIO 按键驱动 用于检测主板按键状态
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 f817dd9..d74841c 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
@@ -766,11 +766,11 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name
IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕 首次发送数据 此时接收缓冲区无数据
IfxQspi_writeTransmitFifo(moudle, (uint8)(register_name & 0x00FF)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 1); // 等待接收完毕 再次发送数据 此时接收缓冲区有1个数据
spi_clear_fifo(moudle); // 清除接收缓存区
@@ -818,11 +818,11 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name,
IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕 首次发送数据 此时接收缓冲区无数据
IfxQspi_writeTransmitFifo(moudle, (uint8)(register_name & 0x00FF)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 1); // 等待接收完毕 再次发送数据 此时接收缓冲区有1个数据
spi_clear_fifo(moudle); // 清除接收缓存区
diff --git a/Example/E05_pit_demo/libraries/doc/version.txt b/Example/E05_pit_demo/libraries/doc/version.txt
index f45bf81..4df6214 100644
--- a/Example/E05_pit_demo/libraries/doc/version.txt
+++ b/Example/E05_pit_demo/libraries/doc/version.txt
@@ -1,3 +1,7 @@
+V3.3.2
+ 新增zf_device_menc15a磁编码器外设驱动
+ 更改uart接收机部分语句
+ 修正SPI的16位通讯错位问题
V3.3.1
移除正交编码器的断言检测
新增重命名工程工具
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 3a140e3..c8f75f2 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
@@ -93,6 +93,7 @@
#include "zf_device_ips114.h"
#include "zf_device_ips200.h"
#include "zf_device_key.h"
+#include "zf_device_menc15a.h"
#include "zf_device_mpu6050.h"
#include "zf_device_mt9v03x.h"
#include "zf_device_oled.h"
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 cc42e43..adfc4a3 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
@@ -91,8 +91,10 @@ ZF_WEAK void seekfree_assistant_interface_init (seekfree_assistant_transfer_devi
{
case SEEKFREE_ASSISTANT_DEBUG_UART:
{
+#if DEBUG_UART_USE_INTERRUPT == 1
seekfree_assistant_transfer_callback = debug_send_buffer;
seekfree_assistant_receive_callback = debug_read_ring_buffer;
+#endif
}break;
case SEEKFREE_ASSISTANT_WIRELESS_UART:
diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_menc15a.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_menc15a.c
new file mode 100644
index 0000000..faaeba2
--- /dev/null
+++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_menc15a.c
@@ -0,0 +1,188 @@
+/*********************************************************************************************************************
+* CYT2BL3 Opensourec Library 即( CYT2BL3 开源库)是一个基于官方 SDK 接口的第三方开源库
+* Copyright (c) 2022 SEEKFREE 逐飞科技
+*
+* 本文件是 CYT2BL3 开源库的一部分
+*
+* CYT2BL3 开源库 是免费软件
+* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
+* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
+*
+* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
+* 甚至没有隐含的适销性或适合特定用途的保证
+* 更多细节请参见 GPL
+*
+* 您应该在收到本开源库的同时收到一份 GPL 的副本
+* 如果没有,请参阅
+*
+* 额外注明:
+* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
+* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
+* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
+* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
+*
+* 文件名称 zf_device_menc15a
+* 公司名称 成都逐飞科技有限公司
+* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
+* 开发环境 IAR 9.40.1
+* 适用平台 CYT2BL3
+* 店铺链接 https://seekfree.taobao.com/
+*
+* 修改记录
+* 日期 作者 备注
+* 2024-11-19 pudding first version
+********************************************************************************************************************/
+/*********************************************************************************************************************
+* 接线定义:
+* ------------------------------------
+* 模块管脚 单片机管脚
+* // 硬件 SPI 引脚
+* SCL/SPC 查看 zf_device_menc15a.h 中 MENC15A_SPC_PIN 宏定义
+* SDA/DSI 查看 zf_device_menc15a.h 中 MENC15A_SDI_PIN 宏定义
+* SA0/SDO 查看 zf_device_menc15a.h 中 MENC15A_SDO_PIN 宏定义
+* CS 查看 zf_device_menc15a.h 中 MENC15A_CS_PIN 宏定义
+* VCC 3.3V电源
+* GND 电源地
+* 其余引脚悬空
+* ------------------------------------
+********************************************************************************************************************/
+
+#include "zf_common_debug.h"
+#include "zf_common_function.h"
+#include "zf_device_config.h"
+#include "zf_driver_delay.h"
+#include "zf_driver_gpio.h"
+#include "zf_driver_spi.h"
+
+#include "zf_device_menc15a.h"
+
+uint16 menc15a_absolute_data[2] = {0};
+
+int16 menc15a_absolute_offset_data[2] = {0};
+
+int16 menc15a_speed_data[2] = {0};
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 计算编码器旋转偏差
+// 参数说明 encoder_max 编码器精度 填写十进制数据
+// 参数说明 now_location 当前位置信息
+// 参数说明 last_location 上一次的位置信息
+// 返回参数 int32 计算的偏差值
+// 使用示例 magnetic_encoder_get_offset();
+// 备注信息
+//-------------------------------------------------------------------------------------------------------------------
+static int32 magnetic_encoder_get_offset (int32 encoder_max, int32 now_location, int32 last_location)
+{
+ int32 result_data = 0;
+
+ if((encoder_max / 2) < func_abs(now_location - last_location))
+ {
+ result_data = ((encoder_max / 2) < now_location ? (now_location - encoder_max - last_location) : (now_location + encoder_max - last_location));
+ }
+ else
+ {
+ result_data = (now_location - last_location);
+ }
+
+ return result_data;
+}
+
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 获取 MENC15A 磁编码器 的 绝对值 角度数据
+// 参数说明 menc15a_module 磁编码器 模块号
+// 返回参数 uint16 绝对值 角度数据
+// 使用示例 menc15a_1_get_absolute_data();
+// 备注信息 执行该函数后,可直接使用返回值 也可以通过查询对应变量获取结果
+//-------------------------------------------------------------------------------------------------------------------
+uint16 menc15a_get_absolute_data(menc15a_module_enum menc15a_module)
+{
+ uint16 read_data = 0;
+
+ uint16 data_last = menc15a_absolute_data[menc15a_module];
+
+ if(menc15a_module == menc15a_1_module)
+ {
+ MENC15A_1_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_1_SPI, 0x8021);
+
+ MENC15A_1_CS(1);
+ }
+ else
+ {
+ MENC15A_2_CS(0);
+
+ spi_write_8bit(MENC15A_2_SPI, 0x80);
+ spi_write_8bit(MENC15A_2_SPI, 0x21);
+ read_data = spi_read_8bit(MENC15A_2_SPI);
+ read_data = ((read_data << 8) | spi_read_8bit(MENC15A_2_SPI));
+
+ MENC15A_2_CS(1);
+ }
+
+ menc15a_absolute_data[menc15a_module] = (read_data & 0x7fff);
+
+ menc15a_absolute_offset_data[menc15a_module] = (int16)magnetic_encoder_get_offset(32768, menc15a_absolute_data[menc15a_module], data_last);
+
+ return menc15a_absolute_data[menc15a_module];
+}
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 获取 MENC15A 磁编码器 的 转速数据
+// 参数说明 menc15a_module 磁编码器 模块号
+// 返回参数 int16 转速数据(每秒旋转弧度 rad/s)
+// 使用示例 menc15a_1_get_speed_data();
+// 备注信息 执行该函数后,可直接使用返回值 也可以通过查询对应变量获取结果
+//-------------------------------------------------------------------------------------------------------------------
+int16 menc15a_get_speed_data(menc15a_module_enum menc15a_module)
+{
+ int16 read_data = 0;
+
+ if(menc15a_module == menc15a_1_module)
+ {
+ MENC15A_1_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_1_SPI, 0x8032);
+
+ MENC15A_1_CS(1);
+ }
+ else
+ {
+ MENC15A_2_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_2_SPI, 0x8032);
+
+ MENC15A_2_CS(1);
+ }
+
+ read_data = (read_data & 0x7fff);
+
+ if(read_data > 16384)
+ {
+ read_data = read_data - 32768;
+ }
+
+ menc15a_speed_data[menc15a_module] = (int16)((float)read_data * 1.917476f);
+
+ return menc15a_speed_data[menc15a_module];
+}
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 初始化 MENC15A
+// 参数说明 void
+// 返回参数 uint8 1-初始化失败 0-初始化成功
+// 使用示例 menc15a_init();
+// 备注信息
+//-------------------------------------------------------------------------------------------------------------------
+uint8 menc15a_init(void)
+{
+ spi_init(MENC15A_1_SPI, SPI_MODE1, MENC15A_1_SPI_SPEED, MENC15A_1_CLK_PIN, MENC15A_1_MOSI_PIN, MENC15A_1_MISO_PIN, SPI_CS_NULL); // 配置 MENC15A-1 的 SPI端口
+ gpio_init(MENC15A_1_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); // 配置 MENC15A-1 的 CS端口
+
+ spi_init(MENC15A_2_SPI, SPI_MODE1, MENC15A_2_SPI_SPEED, MENC15A_2_CLK_PIN, MENC15A_2_MOSI_PIN, MENC15A_2_MISO_PIN, SPI_CS_NULL); // 配置 MENC15A-2 的 SPI端口
+ gpio_init(MENC15A_2_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); // 配置 MENC15A-2 的 CS端口
+
+ return 0;
+}
+
diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_menc15a.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_menc15a.h
new file mode 100644
index 0000000..068d877
--- /dev/null
+++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_menc15a.h
@@ -0,0 +1,102 @@
+/*********************************************************************************************************************
+* CYT2BL3 Opensourec Library 即( CYT2BL3 开源库)是一个基于官方 SDK 接口的第三方开源库
+* Copyright (c) 2022 SEEKFREE 逐飞科技
+*
+* 本文件是 CYT2BL3 开源库的一部分
+*
+* CYT2BL3 开源库 是免费软件
+* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
+* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
+*
+* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
+* 甚至没有隐含的适销性或适合特定用途的保证
+* 更多细节请参见 GPL
+*
+* 您应该在收到本开源库的同时收到一份 GPL 的副本
+* 如果没有,请参阅
+*
+* 额外注明:
+* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
+* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
+* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
+* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
+*
+* 文件名称 zf_device_menc15a
+* 公司名称 成都逐飞科技有限公司
+* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
+* 开发环境 IAR 9.40.1
+* 适用平台 CYT2BL3
+* 店铺链接 https://seekfree.taobao.com/
+*
+* 修改记录
+* 日期 作者 备注
+* 2024-11-19 pudding first version
+********************************************************************************************************************/
+/*********************************************************************************************************************
+* 接线定义:
+* ------------------------------------
+* 模块管脚 单片机管脚
+* // 硬件 SPI 引脚
+* CLK 查看 zf_device_menc15a.h 中 MENC15A_CLK_PIN 宏定义
+* MOSI 查看 zf_device_menc15a.h 中 MENC15A_MOSI_PIN 宏定义
+* MISO 查看 zf_device_menc15a.h 中 MENC15A_MISO_PIN 宏定义
+* CS 查看 zf_device_menc15a.h 中 MENC15A_CS_PIN 宏定义
+* VCC 3.3V电源
+* GND 电源地
+* 其余引脚悬空
+* ------------------------------------
+********************************************************************************************************************/
+
+
+#ifndef _zf_device_menc15a_h_
+#define _zf_device_menc15a_h_
+
+#include "zf_common_typedef.h"
+
+//================================================定义 MENC15A 基本配置================================================
+
+//====================================================硬件 SPI 驱动====================================================
+#define MENC15A_1_SPI_SPEED (20 * 1000 * 1000) // 磁编码器1 硬件 SPI 速率
+#define MENC15A_1_SPI (SPI_0 ) // 磁编码器1 硬件 SPI 号
+#define MENC15A_1_CLK_PIN (SPI0_SCLK_P20_11) // 磁编码器1 硬件 SPI SCK 引脚
+#define MENC15A_1_MOSI_PIN (SPI0_MOSI_P20_14) // 磁编码器1 硬件 SPI MOSI 引脚
+#define MENC15A_1_MISO_PIN (SPI0_MISO_P20_12) // 磁编码器1 硬件 SPI MISO 引脚
+#define MENC15A_1_CS_PIN (P20_13) // 磁编码器1 CS 片选引脚
+#define MENC15A_1_CS(x) ((x) ? (gpio_high(MENC15A_1_CS_PIN)) : (gpio_low(MENC15A_1_CS_PIN)))
+
+
+#define MENC15A_2_SPI_SPEED (20 * 1000 * 1000) // 磁编码器2 硬件 SPI 速率
+#define MENC15A_2_SPI (SPI_0 ) // 磁编码器2 硬件 SPI 号
+#define MENC15A_2_CLK_PIN (SPI0_SCLK_P20_11 ) // 磁编码器2 硬件 SPI SCK 引脚
+#define MENC15A_2_MOSI_PIN (SPI0_MOSI_P20_14 ) // 磁编码器2 硬件 SPI MOSI 引脚
+#define MENC15A_2_MISO_PIN (SPI0_MISO_P20_12 ) // 磁编码器2 硬件 SPI MISO 引脚
+#define MENC15A_2_CS_PIN (P20_15) // 磁编码器2 CS 片选引脚
+#define MENC15A_2_CS(x) ((x) ? (gpio_high(MENC15A_2_CS_PIN)) : (gpio_low(MENC15A_2_CS_PIN)))
+
+//====================================================硬件 SPI 驱动====================================================
+
+// 枚举磁编码模块
+typedef enum
+{
+ menc15a_1_module,
+ menc15a_2_module,
+
+}menc15a_module_enum;
+
+//================================================定义 MENC15A 基本配置================================================
+
+
+extern uint16 menc15a_absolute_data[2];
+
+extern int16 menc15a_absolute_offset_data[2];
+
+extern int16 menc15a_speed_data[2];
+
+
+uint16 menc15a_get_absolute_data(menc15a_module_enum menc15a_module);
+int16 menc15a_get_speed_data(menc15a_module_enum menc15a_module);
+
+uint8 menc15a_init(void);
+
+
+#endif
diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_uart_receiver.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_uart_receiver.c
index 3ebb3bd..ade446d 100644
--- a/Example/E05_pit_demo/libraries/zf_device/zf_device_uart_receiver.c
+++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_uart_receiver.c
@@ -91,7 +91,7 @@ static void uart_receiver_analysis (uart_receiver_struct *remote_data,uint8 * bu
remote_data->channel[num++] = (buffer[5] >> 1 | buffer[6] << 7 ) & 0x07FF;
remote_data->channel[num++] = (buffer[6] >> 4 | buffer[7] << 4 ) & 0x07FF;
remote_data->channel[num++] = (buffer[7] >> 7 | buffer[8] << 1 | buffer[9] << 9 ) & 0x07FF;
- remote_data->state = (SBUS_NORMAL_STATE == buffer[23]) ? 1 : 0;
+ remote_data->state = (SBUS_ABNORMAL_STATE == (buffer[23] & SBUS_ABNORMAL_STATE)) ? 0 : 1;
uart_receiver.finsh_flag = 1;
}
diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_uart_receiver.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_uart_receiver.h
index 948ab2f..6498dcb 100644
--- a/Example/E05_pit_demo/libraries/zf_device/zf_device_uart_receiver.h
+++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_uart_receiver.h
@@ -55,8 +55,7 @@
#define REV_DATA_LEN ( 25 ) // SBUS帧长
#define FRAME_STAR ( 0X0F ) // 帧头信息
#define FRAME_END ( 0X00 ) // 帧尾信息
-#define SBUS_NORMAL_STATE ( 0X03 ) // 正常状态
-#define SBUS_ABNORMAL_STATE ( 0X0F ) // 失控状态
+#define SBUS_ABNORMAL_STATE ( 0X04 ) // 失控状态
typedef struct
{
diff --git a/Example/E05_pit_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt b/Example/E05_pit_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
index 1c96965..40d9e28 100644
--- a/Example/E05_pit_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
+++ b/Example/E05_pit_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
@@ -88,6 +88,8 @@ zf_device_uart_receiver.h SUBS
zf_device_absolute_encoder.h 360° 位置传感器 绝对式迷你 mini 编码器 分辨率:0.088°
+zf_device_menc15a.h 15位高精度磁编码器驱动 位置式
+
zf_device_gnss.h GPS 及 RTK 定位模块 双频高精度定位模块 亚米级定位
zf_device_key.h GPIO 按键驱动 用于检测主板按键状态
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 f817dd9..d74841c 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
@@ -766,11 +766,11 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name
IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕 首次发送数据 此时接收缓冲区无数据
IfxQspi_writeTransmitFifo(moudle, (uint8)(register_name & 0x00FF)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 1); // 等待接收完毕 再次发送数据 此时接收缓冲区有1个数据
spi_clear_fifo(moudle); // 清除接收缓存区
@@ -818,11 +818,11 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name,
IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕 首次发送数据 此时接收缓冲区无数据
IfxQspi_writeTransmitFifo(moudle, (uint8)(register_name & 0x00FF)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 1); // 等待接收完毕 再次发送数据 此时接收缓冲区有1个数据
spi_clear_fifo(moudle); // 清除接收缓存区
diff --git a/Example/E06_exit_demo/libraries/doc/version.txt b/Example/E06_exit_demo/libraries/doc/version.txt
index f45bf81..4df6214 100644
--- a/Example/E06_exit_demo/libraries/doc/version.txt
+++ b/Example/E06_exit_demo/libraries/doc/version.txt
@@ -1,3 +1,7 @@
+V3.3.2
+ 新增zf_device_menc15a磁编码器外设驱动
+ 更改uart接收机部分语句
+ 修正SPI的16位通讯错位问题
V3.3.1
移除正交编码器的断言检测
新增重命名工程工具
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 3a140e3..c8f75f2 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
@@ -93,6 +93,7 @@
#include "zf_device_ips114.h"
#include "zf_device_ips200.h"
#include "zf_device_key.h"
+#include "zf_device_menc15a.h"
#include "zf_device_mpu6050.h"
#include "zf_device_mt9v03x.h"
#include "zf_device_oled.h"
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 cc42e43..adfc4a3 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
@@ -91,8 +91,10 @@ ZF_WEAK void seekfree_assistant_interface_init (seekfree_assistant_transfer_devi
{
case SEEKFREE_ASSISTANT_DEBUG_UART:
{
+#if DEBUG_UART_USE_INTERRUPT == 1
seekfree_assistant_transfer_callback = debug_send_buffer;
seekfree_assistant_receive_callback = debug_read_ring_buffer;
+#endif
}break;
case SEEKFREE_ASSISTANT_WIRELESS_UART:
diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_menc15a.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_menc15a.c
new file mode 100644
index 0000000..faaeba2
--- /dev/null
+++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_menc15a.c
@@ -0,0 +1,188 @@
+/*********************************************************************************************************************
+* CYT2BL3 Opensourec Library 即( CYT2BL3 开源库)是一个基于官方 SDK 接口的第三方开源库
+* Copyright (c) 2022 SEEKFREE 逐飞科技
+*
+* 本文件是 CYT2BL3 开源库的一部分
+*
+* CYT2BL3 开源库 是免费软件
+* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
+* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
+*
+* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
+* 甚至没有隐含的适销性或适合特定用途的保证
+* 更多细节请参见 GPL
+*
+* 您应该在收到本开源库的同时收到一份 GPL 的副本
+* 如果没有,请参阅
+*
+* 额外注明:
+* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
+* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
+* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
+* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
+*
+* 文件名称 zf_device_menc15a
+* 公司名称 成都逐飞科技有限公司
+* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
+* 开发环境 IAR 9.40.1
+* 适用平台 CYT2BL3
+* 店铺链接 https://seekfree.taobao.com/
+*
+* 修改记录
+* 日期 作者 备注
+* 2024-11-19 pudding first version
+********************************************************************************************************************/
+/*********************************************************************************************************************
+* 接线定义:
+* ------------------------------------
+* 模块管脚 单片机管脚
+* // 硬件 SPI 引脚
+* SCL/SPC 查看 zf_device_menc15a.h 中 MENC15A_SPC_PIN 宏定义
+* SDA/DSI 查看 zf_device_menc15a.h 中 MENC15A_SDI_PIN 宏定义
+* SA0/SDO 查看 zf_device_menc15a.h 中 MENC15A_SDO_PIN 宏定义
+* CS 查看 zf_device_menc15a.h 中 MENC15A_CS_PIN 宏定义
+* VCC 3.3V电源
+* GND 电源地
+* 其余引脚悬空
+* ------------------------------------
+********************************************************************************************************************/
+
+#include "zf_common_debug.h"
+#include "zf_common_function.h"
+#include "zf_device_config.h"
+#include "zf_driver_delay.h"
+#include "zf_driver_gpio.h"
+#include "zf_driver_spi.h"
+
+#include "zf_device_menc15a.h"
+
+uint16 menc15a_absolute_data[2] = {0};
+
+int16 menc15a_absolute_offset_data[2] = {0};
+
+int16 menc15a_speed_data[2] = {0};
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 计算编码器旋转偏差
+// 参数说明 encoder_max 编码器精度 填写十进制数据
+// 参数说明 now_location 当前位置信息
+// 参数说明 last_location 上一次的位置信息
+// 返回参数 int32 计算的偏差值
+// 使用示例 magnetic_encoder_get_offset();
+// 备注信息
+//-------------------------------------------------------------------------------------------------------------------
+static int32 magnetic_encoder_get_offset (int32 encoder_max, int32 now_location, int32 last_location)
+{
+ int32 result_data = 0;
+
+ if((encoder_max / 2) < func_abs(now_location - last_location))
+ {
+ result_data = ((encoder_max / 2) < now_location ? (now_location - encoder_max - last_location) : (now_location + encoder_max - last_location));
+ }
+ else
+ {
+ result_data = (now_location - last_location);
+ }
+
+ return result_data;
+}
+
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 获取 MENC15A 磁编码器 的 绝对值 角度数据
+// 参数说明 menc15a_module 磁编码器 模块号
+// 返回参数 uint16 绝对值 角度数据
+// 使用示例 menc15a_1_get_absolute_data();
+// 备注信息 执行该函数后,可直接使用返回值 也可以通过查询对应变量获取结果
+//-------------------------------------------------------------------------------------------------------------------
+uint16 menc15a_get_absolute_data(menc15a_module_enum menc15a_module)
+{
+ uint16 read_data = 0;
+
+ uint16 data_last = menc15a_absolute_data[menc15a_module];
+
+ if(menc15a_module == menc15a_1_module)
+ {
+ MENC15A_1_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_1_SPI, 0x8021);
+
+ MENC15A_1_CS(1);
+ }
+ else
+ {
+ MENC15A_2_CS(0);
+
+ spi_write_8bit(MENC15A_2_SPI, 0x80);
+ spi_write_8bit(MENC15A_2_SPI, 0x21);
+ read_data = spi_read_8bit(MENC15A_2_SPI);
+ read_data = ((read_data << 8) | spi_read_8bit(MENC15A_2_SPI));
+
+ MENC15A_2_CS(1);
+ }
+
+ menc15a_absolute_data[menc15a_module] = (read_data & 0x7fff);
+
+ menc15a_absolute_offset_data[menc15a_module] = (int16)magnetic_encoder_get_offset(32768, menc15a_absolute_data[menc15a_module], data_last);
+
+ return menc15a_absolute_data[menc15a_module];
+}
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 获取 MENC15A 磁编码器 的 转速数据
+// 参数说明 menc15a_module 磁编码器 模块号
+// 返回参数 int16 转速数据(每秒旋转弧度 rad/s)
+// 使用示例 menc15a_1_get_speed_data();
+// 备注信息 执行该函数后,可直接使用返回值 也可以通过查询对应变量获取结果
+//-------------------------------------------------------------------------------------------------------------------
+int16 menc15a_get_speed_data(menc15a_module_enum menc15a_module)
+{
+ int16 read_data = 0;
+
+ if(menc15a_module == menc15a_1_module)
+ {
+ MENC15A_1_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_1_SPI, 0x8032);
+
+ MENC15A_1_CS(1);
+ }
+ else
+ {
+ MENC15A_2_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_2_SPI, 0x8032);
+
+ MENC15A_2_CS(1);
+ }
+
+ read_data = (read_data & 0x7fff);
+
+ if(read_data > 16384)
+ {
+ read_data = read_data - 32768;
+ }
+
+ menc15a_speed_data[menc15a_module] = (int16)((float)read_data * 1.917476f);
+
+ return menc15a_speed_data[menc15a_module];
+}
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 初始化 MENC15A
+// 参数说明 void
+// 返回参数 uint8 1-初始化失败 0-初始化成功
+// 使用示例 menc15a_init();
+// 备注信息
+//-------------------------------------------------------------------------------------------------------------------
+uint8 menc15a_init(void)
+{
+ spi_init(MENC15A_1_SPI, SPI_MODE1, MENC15A_1_SPI_SPEED, MENC15A_1_CLK_PIN, MENC15A_1_MOSI_PIN, MENC15A_1_MISO_PIN, SPI_CS_NULL); // 配置 MENC15A-1 的 SPI端口
+ gpio_init(MENC15A_1_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); // 配置 MENC15A-1 的 CS端口
+
+ spi_init(MENC15A_2_SPI, SPI_MODE1, MENC15A_2_SPI_SPEED, MENC15A_2_CLK_PIN, MENC15A_2_MOSI_PIN, MENC15A_2_MISO_PIN, SPI_CS_NULL); // 配置 MENC15A-2 的 SPI端口
+ gpio_init(MENC15A_2_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); // 配置 MENC15A-2 的 CS端口
+
+ return 0;
+}
+
diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_menc15a.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_menc15a.h
new file mode 100644
index 0000000..068d877
--- /dev/null
+++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_menc15a.h
@@ -0,0 +1,102 @@
+/*********************************************************************************************************************
+* CYT2BL3 Opensourec Library 即( CYT2BL3 开源库)是一个基于官方 SDK 接口的第三方开源库
+* Copyright (c) 2022 SEEKFREE 逐飞科技
+*
+* 本文件是 CYT2BL3 开源库的一部分
+*
+* CYT2BL3 开源库 是免费软件
+* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
+* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
+*
+* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
+* 甚至没有隐含的适销性或适合特定用途的保证
+* 更多细节请参见 GPL
+*
+* 您应该在收到本开源库的同时收到一份 GPL 的副本
+* 如果没有,请参阅
+*
+* 额外注明:
+* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
+* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
+* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
+* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
+*
+* 文件名称 zf_device_menc15a
+* 公司名称 成都逐飞科技有限公司
+* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
+* 开发环境 IAR 9.40.1
+* 适用平台 CYT2BL3
+* 店铺链接 https://seekfree.taobao.com/
+*
+* 修改记录
+* 日期 作者 备注
+* 2024-11-19 pudding first version
+********************************************************************************************************************/
+/*********************************************************************************************************************
+* 接线定义:
+* ------------------------------------
+* 模块管脚 单片机管脚
+* // 硬件 SPI 引脚
+* CLK 查看 zf_device_menc15a.h 中 MENC15A_CLK_PIN 宏定义
+* MOSI 查看 zf_device_menc15a.h 中 MENC15A_MOSI_PIN 宏定义
+* MISO 查看 zf_device_menc15a.h 中 MENC15A_MISO_PIN 宏定义
+* CS 查看 zf_device_menc15a.h 中 MENC15A_CS_PIN 宏定义
+* VCC 3.3V电源
+* GND 电源地
+* 其余引脚悬空
+* ------------------------------------
+********************************************************************************************************************/
+
+
+#ifndef _zf_device_menc15a_h_
+#define _zf_device_menc15a_h_
+
+#include "zf_common_typedef.h"
+
+//================================================定义 MENC15A 基本配置================================================
+
+//====================================================硬件 SPI 驱动====================================================
+#define MENC15A_1_SPI_SPEED (20 * 1000 * 1000) // 磁编码器1 硬件 SPI 速率
+#define MENC15A_1_SPI (SPI_0 ) // 磁编码器1 硬件 SPI 号
+#define MENC15A_1_CLK_PIN (SPI0_SCLK_P20_11) // 磁编码器1 硬件 SPI SCK 引脚
+#define MENC15A_1_MOSI_PIN (SPI0_MOSI_P20_14) // 磁编码器1 硬件 SPI MOSI 引脚
+#define MENC15A_1_MISO_PIN (SPI0_MISO_P20_12) // 磁编码器1 硬件 SPI MISO 引脚
+#define MENC15A_1_CS_PIN (P20_13) // 磁编码器1 CS 片选引脚
+#define MENC15A_1_CS(x) ((x) ? (gpio_high(MENC15A_1_CS_PIN)) : (gpio_low(MENC15A_1_CS_PIN)))
+
+
+#define MENC15A_2_SPI_SPEED (20 * 1000 * 1000) // 磁编码器2 硬件 SPI 速率
+#define MENC15A_2_SPI (SPI_0 ) // 磁编码器2 硬件 SPI 号
+#define MENC15A_2_CLK_PIN (SPI0_SCLK_P20_11 ) // 磁编码器2 硬件 SPI SCK 引脚
+#define MENC15A_2_MOSI_PIN (SPI0_MOSI_P20_14 ) // 磁编码器2 硬件 SPI MOSI 引脚
+#define MENC15A_2_MISO_PIN (SPI0_MISO_P20_12 ) // 磁编码器2 硬件 SPI MISO 引脚
+#define MENC15A_2_CS_PIN (P20_15) // 磁编码器2 CS 片选引脚
+#define MENC15A_2_CS(x) ((x) ? (gpio_high(MENC15A_2_CS_PIN)) : (gpio_low(MENC15A_2_CS_PIN)))
+
+//====================================================硬件 SPI 驱动====================================================
+
+// 枚举磁编码模块
+typedef enum
+{
+ menc15a_1_module,
+ menc15a_2_module,
+
+}menc15a_module_enum;
+
+//================================================定义 MENC15A 基本配置================================================
+
+
+extern uint16 menc15a_absolute_data[2];
+
+extern int16 menc15a_absolute_offset_data[2];
+
+extern int16 menc15a_speed_data[2];
+
+
+uint16 menc15a_get_absolute_data(menc15a_module_enum menc15a_module);
+int16 menc15a_get_speed_data(menc15a_module_enum menc15a_module);
+
+uint8 menc15a_init(void);
+
+
+#endif
diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_uart_receiver.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_uart_receiver.c
index 3ebb3bd..ade446d 100644
--- a/Example/E06_exit_demo/libraries/zf_device/zf_device_uart_receiver.c
+++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_uart_receiver.c
@@ -91,7 +91,7 @@ static void uart_receiver_analysis (uart_receiver_struct *remote_data,uint8 * bu
remote_data->channel[num++] = (buffer[5] >> 1 | buffer[6] << 7 ) & 0x07FF;
remote_data->channel[num++] = (buffer[6] >> 4 | buffer[7] << 4 ) & 0x07FF;
remote_data->channel[num++] = (buffer[7] >> 7 | buffer[8] << 1 | buffer[9] << 9 ) & 0x07FF;
- remote_data->state = (SBUS_NORMAL_STATE == buffer[23]) ? 1 : 0;
+ remote_data->state = (SBUS_ABNORMAL_STATE == (buffer[23] & SBUS_ABNORMAL_STATE)) ? 0 : 1;
uart_receiver.finsh_flag = 1;
}
diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_uart_receiver.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_uart_receiver.h
index 948ab2f..6498dcb 100644
--- a/Example/E06_exit_demo/libraries/zf_device/zf_device_uart_receiver.h
+++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_uart_receiver.h
@@ -55,8 +55,7 @@
#define REV_DATA_LEN ( 25 ) // SBUS帧长
#define FRAME_STAR ( 0X0F ) // 帧头信息
#define FRAME_END ( 0X00 ) // 帧尾信息
-#define SBUS_NORMAL_STATE ( 0X03 ) // 正常状态
-#define SBUS_ABNORMAL_STATE ( 0X0F ) // 失控状态
+#define SBUS_ABNORMAL_STATE ( 0X04 ) // 失控状态
typedef struct
{
diff --git a/Example/E06_exit_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt b/Example/E06_exit_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
index 1c96965..40d9e28 100644
--- a/Example/E06_exit_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
+++ b/Example/E06_exit_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
@@ -88,6 +88,8 @@ zf_device_uart_receiver.h SUBS
zf_device_absolute_encoder.h 360° 位置传感器 绝对式迷你 mini 编码器 分辨率:0.088°
+zf_device_menc15a.h 15位高精度磁编码器驱动 位置式
+
zf_device_gnss.h GPS 及 RTK 定位模块 双频高精度定位模块 亚米级定位
zf_device_key.h GPIO 按键驱动 用于检测主板按键状态
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 f817dd9..d74841c 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
@@ -766,11 +766,11 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name
IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕 首次发送数据 此时接收缓冲区无数据
IfxQspi_writeTransmitFifo(moudle, (uint8)(register_name & 0x00FF)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 1); // 等待接收完毕 再次发送数据 此时接收缓冲区有1个数据
spi_clear_fifo(moudle); // 清除接收缓存区
@@ -818,11 +818,11 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name,
IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕 首次发送数据 此时接收缓冲区无数据
IfxQspi_writeTransmitFifo(moudle, (uint8)(register_name & 0x00FF)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 1); // 等待接收完毕 再次发送数据 此时接收缓冲区有1个数据
spi_clear_fifo(moudle); // 清除接收缓存区
diff --git a/Example/E07_encoder_demo/libraries/doc/version.txt b/Example/E07_encoder_demo/libraries/doc/version.txt
index f45bf81..4df6214 100644
--- a/Example/E07_encoder_demo/libraries/doc/version.txt
+++ b/Example/E07_encoder_demo/libraries/doc/version.txt
@@ -1,3 +1,7 @@
+V3.3.2
+ 新增zf_device_menc15a磁编码器外设驱动
+ 更改uart接收机部分语句
+ 修正SPI的16位通讯错位问题
V3.3.1
移除正交编码器的断言检测
新增重命名工程工具
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 3a140e3..c8f75f2 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
@@ -93,6 +93,7 @@
#include "zf_device_ips114.h"
#include "zf_device_ips200.h"
#include "zf_device_key.h"
+#include "zf_device_menc15a.h"
#include "zf_device_mpu6050.h"
#include "zf_device_mt9v03x.h"
#include "zf_device_oled.h"
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 cc42e43..adfc4a3 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
@@ -91,8 +91,10 @@ ZF_WEAK void seekfree_assistant_interface_init (seekfree_assistant_transfer_devi
{
case SEEKFREE_ASSISTANT_DEBUG_UART:
{
+#if DEBUG_UART_USE_INTERRUPT == 1
seekfree_assistant_transfer_callback = debug_send_buffer;
seekfree_assistant_receive_callback = debug_read_ring_buffer;
+#endif
}break;
case SEEKFREE_ASSISTANT_WIRELESS_UART:
diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_menc15a.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_menc15a.c
new file mode 100644
index 0000000..faaeba2
--- /dev/null
+++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_menc15a.c
@@ -0,0 +1,188 @@
+/*********************************************************************************************************************
+* CYT2BL3 Opensourec Library 即( CYT2BL3 开源库)是一个基于官方 SDK 接口的第三方开源库
+* Copyright (c) 2022 SEEKFREE 逐飞科技
+*
+* 本文件是 CYT2BL3 开源库的一部分
+*
+* CYT2BL3 开源库 是免费软件
+* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
+* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
+*
+* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
+* 甚至没有隐含的适销性或适合特定用途的保证
+* 更多细节请参见 GPL
+*
+* 您应该在收到本开源库的同时收到一份 GPL 的副本
+* 如果没有,请参阅
+*
+* 额外注明:
+* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
+* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
+* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
+* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
+*
+* 文件名称 zf_device_menc15a
+* 公司名称 成都逐飞科技有限公司
+* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
+* 开发环境 IAR 9.40.1
+* 适用平台 CYT2BL3
+* 店铺链接 https://seekfree.taobao.com/
+*
+* 修改记录
+* 日期 作者 备注
+* 2024-11-19 pudding first version
+********************************************************************************************************************/
+/*********************************************************************************************************************
+* 接线定义:
+* ------------------------------------
+* 模块管脚 单片机管脚
+* // 硬件 SPI 引脚
+* SCL/SPC 查看 zf_device_menc15a.h 中 MENC15A_SPC_PIN 宏定义
+* SDA/DSI 查看 zf_device_menc15a.h 中 MENC15A_SDI_PIN 宏定义
+* SA0/SDO 查看 zf_device_menc15a.h 中 MENC15A_SDO_PIN 宏定义
+* CS 查看 zf_device_menc15a.h 中 MENC15A_CS_PIN 宏定义
+* VCC 3.3V电源
+* GND 电源地
+* 其余引脚悬空
+* ------------------------------------
+********************************************************************************************************************/
+
+#include "zf_common_debug.h"
+#include "zf_common_function.h"
+#include "zf_device_config.h"
+#include "zf_driver_delay.h"
+#include "zf_driver_gpio.h"
+#include "zf_driver_spi.h"
+
+#include "zf_device_menc15a.h"
+
+uint16 menc15a_absolute_data[2] = {0};
+
+int16 menc15a_absolute_offset_data[2] = {0};
+
+int16 menc15a_speed_data[2] = {0};
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 计算编码器旋转偏差
+// 参数说明 encoder_max 编码器精度 填写十进制数据
+// 参数说明 now_location 当前位置信息
+// 参数说明 last_location 上一次的位置信息
+// 返回参数 int32 计算的偏差值
+// 使用示例 magnetic_encoder_get_offset();
+// 备注信息
+//-------------------------------------------------------------------------------------------------------------------
+static int32 magnetic_encoder_get_offset (int32 encoder_max, int32 now_location, int32 last_location)
+{
+ int32 result_data = 0;
+
+ if((encoder_max / 2) < func_abs(now_location - last_location))
+ {
+ result_data = ((encoder_max / 2) < now_location ? (now_location - encoder_max - last_location) : (now_location + encoder_max - last_location));
+ }
+ else
+ {
+ result_data = (now_location - last_location);
+ }
+
+ return result_data;
+}
+
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 获取 MENC15A 磁编码器 的 绝对值 角度数据
+// 参数说明 menc15a_module 磁编码器 模块号
+// 返回参数 uint16 绝对值 角度数据
+// 使用示例 menc15a_1_get_absolute_data();
+// 备注信息 执行该函数后,可直接使用返回值 也可以通过查询对应变量获取结果
+//-------------------------------------------------------------------------------------------------------------------
+uint16 menc15a_get_absolute_data(menc15a_module_enum menc15a_module)
+{
+ uint16 read_data = 0;
+
+ uint16 data_last = menc15a_absolute_data[menc15a_module];
+
+ if(menc15a_module == menc15a_1_module)
+ {
+ MENC15A_1_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_1_SPI, 0x8021);
+
+ MENC15A_1_CS(1);
+ }
+ else
+ {
+ MENC15A_2_CS(0);
+
+ spi_write_8bit(MENC15A_2_SPI, 0x80);
+ spi_write_8bit(MENC15A_2_SPI, 0x21);
+ read_data = spi_read_8bit(MENC15A_2_SPI);
+ read_data = ((read_data << 8) | spi_read_8bit(MENC15A_2_SPI));
+
+ MENC15A_2_CS(1);
+ }
+
+ menc15a_absolute_data[menc15a_module] = (read_data & 0x7fff);
+
+ menc15a_absolute_offset_data[menc15a_module] = (int16)magnetic_encoder_get_offset(32768, menc15a_absolute_data[menc15a_module], data_last);
+
+ return menc15a_absolute_data[menc15a_module];
+}
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 获取 MENC15A 磁编码器 的 转速数据
+// 参数说明 menc15a_module 磁编码器 模块号
+// 返回参数 int16 转速数据(每秒旋转弧度 rad/s)
+// 使用示例 menc15a_1_get_speed_data();
+// 备注信息 执行该函数后,可直接使用返回值 也可以通过查询对应变量获取结果
+//-------------------------------------------------------------------------------------------------------------------
+int16 menc15a_get_speed_data(menc15a_module_enum menc15a_module)
+{
+ int16 read_data = 0;
+
+ if(menc15a_module == menc15a_1_module)
+ {
+ MENC15A_1_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_1_SPI, 0x8032);
+
+ MENC15A_1_CS(1);
+ }
+ else
+ {
+ MENC15A_2_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_2_SPI, 0x8032);
+
+ MENC15A_2_CS(1);
+ }
+
+ read_data = (read_data & 0x7fff);
+
+ if(read_data > 16384)
+ {
+ read_data = read_data - 32768;
+ }
+
+ menc15a_speed_data[menc15a_module] = (int16)((float)read_data * 1.917476f);
+
+ return menc15a_speed_data[menc15a_module];
+}
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 初始化 MENC15A
+// 参数说明 void
+// 返回参数 uint8 1-初始化失败 0-初始化成功
+// 使用示例 menc15a_init();
+// 备注信息
+//-------------------------------------------------------------------------------------------------------------------
+uint8 menc15a_init(void)
+{
+ spi_init(MENC15A_1_SPI, SPI_MODE1, MENC15A_1_SPI_SPEED, MENC15A_1_CLK_PIN, MENC15A_1_MOSI_PIN, MENC15A_1_MISO_PIN, SPI_CS_NULL); // 配置 MENC15A-1 的 SPI端口
+ gpio_init(MENC15A_1_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); // 配置 MENC15A-1 的 CS端口
+
+ spi_init(MENC15A_2_SPI, SPI_MODE1, MENC15A_2_SPI_SPEED, MENC15A_2_CLK_PIN, MENC15A_2_MOSI_PIN, MENC15A_2_MISO_PIN, SPI_CS_NULL); // 配置 MENC15A-2 的 SPI端口
+ gpio_init(MENC15A_2_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); // 配置 MENC15A-2 的 CS端口
+
+ return 0;
+}
+
diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_menc15a.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_menc15a.h
new file mode 100644
index 0000000..068d877
--- /dev/null
+++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_menc15a.h
@@ -0,0 +1,102 @@
+/*********************************************************************************************************************
+* CYT2BL3 Opensourec Library 即( CYT2BL3 开源库)是一个基于官方 SDK 接口的第三方开源库
+* Copyright (c) 2022 SEEKFREE 逐飞科技
+*
+* 本文件是 CYT2BL3 开源库的一部分
+*
+* CYT2BL3 开源库 是免费软件
+* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
+* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
+*
+* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
+* 甚至没有隐含的适销性或适合特定用途的保证
+* 更多细节请参见 GPL
+*
+* 您应该在收到本开源库的同时收到一份 GPL 的副本
+* 如果没有,请参阅
+*
+* 额外注明:
+* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
+* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
+* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
+* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
+*
+* 文件名称 zf_device_menc15a
+* 公司名称 成都逐飞科技有限公司
+* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
+* 开发环境 IAR 9.40.1
+* 适用平台 CYT2BL3
+* 店铺链接 https://seekfree.taobao.com/
+*
+* 修改记录
+* 日期 作者 备注
+* 2024-11-19 pudding first version
+********************************************************************************************************************/
+/*********************************************************************************************************************
+* 接线定义:
+* ------------------------------------
+* 模块管脚 单片机管脚
+* // 硬件 SPI 引脚
+* CLK 查看 zf_device_menc15a.h 中 MENC15A_CLK_PIN 宏定义
+* MOSI 查看 zf_device_menc15a.h 中 MENC15A_MOSI_PIN 宏定义
+* MISO 查看 zf_device_menc15a.h 中 MENC15A_MISO_PIN 宏定义
+* CS 查看 zf_device_menc15a.h 中 MENC15A_CS_PIN 宏定义
+* VCC 3.3V电源
+* GND 电源地
+* 其余引脚悬空
+* ------------------------------------
+********************************************************************************************************************/
+
+
+#ifndef _zf_device_menc15a_h_
+#define _zf_device_menc15a_h_
+
+#include "zf_common_typedef.h"
+
+//================================================定义 MENC15A 基本配置================================================
+
+//====================================================硬件 SPI 驱动====================================================
+#define MENC15A_1_SPI_SPEED (20 * 1000 * 1000) // 磁编码器1 硬件 SPI 速率
+#define MENC15A_1_SPI (SPI_0 ) // 磁编码器1 硬件 SPI 号
+#define MENC15A_1_CLK_PIN (SPI0_SCLK_P20_11) // 磁编码器1 硬件 SPI SCK 引脚
+#define MENC15A_1_MOSI_PIN (SPI0_MOSI_P20_14) // 磁编码器1 硬件 SPI MOSI 引脚
+#define MENC15A_1_MISO_PIN (SPI0_MISO_P20_12) // 磁编码器1 硬件 SPI MISO 引脚
+#define MENC15A_1_CS_PIN (P20_13) // 磁编码器1 CS 片选引脚
+#define MENC15A_1_CS(x) ((x) ? (gpio_high(MENC15A_1_CS_PIN)) : (gpio_low(MENC15A_1_CS_PIN)))
+
+
+#define MENC15A_2_SPI_SPEED (20 * 1000 * 1000) // 磁编码器2 硬件 SPI 速率
+#define MENC15A_2_SPI (SPI_0 ) // 磁编码器2 硬件 SPI 号
+#define MENC15A_2_CLK_PIN (SPI0_SCLK_P20_11 ) // 磁编码器2 硬件 SPI SCK 引脚
+#define MENC15A_2_MOSI_PIN (SPI0_MOSI_P20_14 ) // 磁编码器2 硬件 SPI MOSI 引脚
+#define MENC15A_2_MISO_PIN (SPI0_MISO_P20_12 ) // 磁编码器2 硬件 SPI MISO 引脚
+#define MENC15A_2_CS_PIN (P20_15) // 磁编码器2 CS 片选引脚
+#define MENC15A_2_CS(x) ((x) ? (gpio_high(MENC15A_2_CS_PIN)) : (gpio_low(MENC15A_2_CS_PIN)))
+
+//====================================================硬件 SPI 驱动====================================================
+
+// 枚举磁编码模块
+typedef enum
+{
+ menc15a_1_module,
+ menc15a_2_module,
+
+}menc15a_module_enum;
+
+//================================================定义 MENC15A 基本配置================================================
+
+
+extern uint16 menc15a_absolute_data[2];
+
+extern int16 menc15a_absolute_offset_data[2];
+
+extern int16 menc15a_speed_data[2];
+
+
+uint16 menc15a_get_absolute_data(menc15a_module_enum menc15a_module);
+int16 menc15a_get_speed_data(menc15a_module_enum menc15a_module);
+
+uint8 menc15a_init(void);
+
+
+#endif
diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_uart_receiver.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_uart_receiver.c
index 3ebb3bd..ade446d 100644
--- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_uart_receiver.c
+++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_uart_receiver.c
@@ -91,7 +91,7 @@ static void uart_receiver_analysis (uart_receiver_struct *remote_data,uint8 * bu
remote_data->channel[num++] = (buffer[5] >> 1 | buffer[6] << 7 ) & 0x07FF;
remote_data->channel[num++] = (buffer[6] >> 4 | buffer[7] << 4 ) & 0x07FF;
remote_data->channel[num++] = (buffer[7] >> 7 | buffer[8] << 1 | buffer[9] << 9 ) & 0x07FF;
- remote_data->state = (SBUS_NORMAL_STATE == buffer[23]) ? 1 : 0;
+ remote_data->state = (SBUS_ABNORMAL_STATE == (buffer[23] & SBUS_ABNORMAL_STATE)) ? 0 : 1;
uart_receiver.finsh_flag = 1;
}
diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_uart_receiver.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_uart_receiver.h
index 948ab2f..6498dcb 100644
--- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_uart_receiver.h
+++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_uart_receiver.h
@@ -55,8 +55,7 @@
#define REV_DATA_LEN ( 25 ) // SBUS帧长
#define FRAME_STAR ( 0X0F ) // 帧头信息
#define FRAME_END ( 0X00 ) // 帧尾信息
-#define SBUS_NORMAL_STATE ( 0X03 ) // 正常状态
-#define SBUS_ABNORMAL_STATE ( 0X0F ) // 失控状态
+#define SBUS_ABNORMAL_STATE ( 0X04 ) // 失控状态
typedef struct
{
diff --git a/Example/E07_encoder_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt b/Example/E07_encoder_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
index 1c96965..40d9e28 100644
--- a/Example/E07_encoder_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
+++ b/Example/E07_encoder_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
@@ -88,6 +88,8 @@ zf_device_uart_receiver.h SUBS
zf_device_absolute_encoder.h 360° 位置传感器 绝对式迷你 mini 编码器 分辨率:0.088°
+zf_device_menc15a.h 15位高精度磁编码器驱动 位置式
+
zf_device_gnss.h GPS 及 RTK 定位模块 双频高精度定位模块 亚米级定位
zf_device_key.h GPIO 按键驱动 用于检测主板按键状态
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 f817dd9..d74841c 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
@@ -766,11 +766,11 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name
IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕 首次发送数据 此时接收缓冲区无数据
IfxQspi_writeTransmitFifo(moudle, (uint8)(register_name & 0x00FF)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 1); // 等待接收完毕 再次发送数据 此时接收缓冲区有1个数据
spi_clear_fifo(moudle); // 清除接收缓存区
@@ -818,11 +818,11 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name,
IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕 首次发送数据 此时接收缓冲区无数据
IfxQspi_writeTransmitFifo(moudle, (uint8)(register_name & 0x00FF)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 1); // 等待接收完毕 再次发送数据 此时接收缓冲区有1个数据
spi_clear_fifo(moudle); // 清除接收缓存区
diff --git a/Example/E08_eeprom_demo/libraries/doc/version.txt b/Example/E08_eeprom_demo/libraries/doc/version.txt
index f45bf81..4df6214 100644
--- a/Example/E08_eeprom_demo/libraries/doc/version.txt
+++ b/Example/E08_eeprom_demo/libraries/doc/version.txt
@@ -1,3 +1,7 @@
+V3.3.2
+ 新增zf_device_menc15a磁编码器外设驱动
+ 更改uart接收机部分语句
+ 修正SPI的16位通讯错位问题
V3.3.1
移除正交编码器的断言检测
新增重命名工程工具
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 3a140e3..c8f75f2 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
@@ -93,6 +93,7 @@
#include "zf_device_ips114.h"
#include "zf_device_ips200.h"
#include "zf_device_key.h"
+#include "zf_device_menc15a.h"
#include "zf_device_mpu6050.h"
#include "zf_device_mt9v03x.h"
#include "zf_device_oled.h"
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 cc42e43..adfc4a3 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
@@ -91,8 +91,10 @@ ZF_WEAK void seekfree_assistant_interface_init (seekfree_assistant_transfer_devi
{
case SEEKFREE_ASSISTANT_DEBUG_UART:
{
+#if DEBUG_UART_USE_INTERRUPT == 1
seekfree_assistant_transfer_callback = debug_send_buffer;
seekfree_assistant_receive_callback = debug_read_ring_buffer;
+#endif
}break;
case SEEKFREE_ASSISTANT_WIRELESS_UART:
diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_menc15a.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_menc15a.c
new file mode 100644
index 0000000..faaeba2
--- /dev/null
+++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_menc15a.c
@@ -0,0 +1,188 @@
+/*********************************************************************************************************************
+* CYT2BL3 Opensourec Library 即( CYT2BL3 开源库)是一个基于官方 SDK 接口的第三方开源库
+* Copyright (c) 2022 SEEKFREE 逐飞科技
+*
+* 本文件是 CYT2BL3 开源库的一部分
+*
+* CYT2BL3 开源库 是免费软件
+* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
+* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
+*
+* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
+* 甚至没有隐含的适销性或适合特定用途的保证
+* 更多细节请参见 GPL
+*
+* 您应该在收到本开源库的同时收到一份 GPL 的副本
+* 如果没有,请参阅
+*
+* 额外注明:
+* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
+* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
+* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
+* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
+*
+* 文件名称 zf_device_menc15a
+* 公司名称 成都逐飞科技有限公司
+* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
+* 开发环境 IAR 9.40.1
+* 适用平台 CYT2BL3
+* 店铺链接 https://seekfree.taobao.com/
+*
+* 修改记录
+* 日期 作者 备注
+* 2024-11-19 pudding first version
+********************************************************************************************************************/
+/*********************************************************************************************************************
+* 接线定义:
+* ------------------------------------
+* 模块管脚 单片机管脚
+* // 硬件 SPI 引脚
+* SCL/SPC 查看 zf_device_menc15a.h 中 MENC15A_SPC_PIN 宏定义
+* SDA/DSI 查看 zf_device_menc15a.h 中 MENC15A_SDI_PIN 宏定义
+* SA0/SDO 查看 zf_device_menc15a.h 中 MENC15A_SDO_PIN 宏定义
+* CS 查看 zf_device_menc15a.h 中 MENC15A_CS_PIN 宏定义
+* VCC 3.3V电源
+* GND 电源地
+* 其余引脚悬空
+* ------------------------------------
+********************************************************************************************************************/
+
+#include "zf_common_debug.h"
+#include "zf_common_function.h"
+#include "zf_device_config.h"
+#include "zf_driver_delay.h"
+#include "zf_driver_gpio.h"
+#include "zf_driver_spi.h"
+
+#include "zf_device_menc15a.h"
+
+uint16 menc15a_absolute_data[2] = {0};
+
+int16 menc15a_absolute_offset_data[2] = {0};
+
+int16 menc15a_speed_data[2] = {0};
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 计算编码器旋转偏差
+// 参数说明 encoder_max 编码器精度 填写十进制数据
+// 参数说明 now_location 当前位置信息
+// 参数说明 last_location 上一次的位置信息
+// 返回参数 int32 计算的偏差值
+// 使用示例 magnetic_encoder_get_offset();
+// 备注信息
+//-------------------------------------------------------------------------------------------------------------------
+static int32 magnetic_encoder_get_offset (int32 encoder_max, int32 now_location, int32 last_location)
+{
+ int32 result_data = 0;
+
+ if((encoder_max / 2) < func_abs(now_location - last_location))
+ {
+ result_data = ((encoder_max / 2) < now_location ? (now_location - encoder_max - last_location) : (now_location + encoder_max - last_location));
+ }
+ else
+ {
+ result_data = (now_location - last_location);
+ }
+
+ return result_data;
+}
+
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 获取 MENC15A 磁编码器 的 绝对值 角度数据
+// 参数说明 menc15a_module 磁编码器 模块号
+// 返回参数 uint16 绝对值 角度数据
+// 使用示例 menc15a_1_get_absolute_data();
+// 备注信息 执行该函数后,可直接使用返回值 也可以通过查询对应变量获取结果
+//-------------------------------------------------------------------------------------------------------------------
+uint16 menc15a_get_absolute_data(menc15a_module_enum menc15a_module)
+{
+ uint16 read_data = 0;
+
+ uint16 data_last = menc15a_absolute_data[menc15a_module];
+
+ if(menc15a_module == menc15a_1_module)
+ {
+ MENC15A_1_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_1_SPI, 0x8021);
+
+ MENC15A_1_CS(1);
+ }
+ else
+ {
+ MENC15A_2_CS(0);
+
+ spi_write_8bit(MENC15A_2_SPI, 0x80);
+ spi_write_8bit(MENC15A_2_SPI, 0x21);
+ read_data = spi_read_8bit(MENC15A_2_SPI);
+ read_data = ((read_data << 8) | spi_read_8bit(MENC15A_2_SPI));
+
+ MENC15A_2_CS(1);
+ }
+
+ menc15a_absolute_data[menc15a_module] = (read_data & 0x7fff);
+
+ menc15a_absolute_offset_data[menc15a_module] = (int16)magnetic_encoder_get_offset(32768, menc15a_absolute_data[menc15a_module], data_last);
+
+ return menc15a_absolute_data[menc15a_module];
+}
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 获取 MENC15A 磁编码器 的 转速数据
+// 参数说明 menc15a_module 磁编码器 模块号
+// 返回参数 int16 转速数据(每秒旋转弧度 rad/s)
+// 使用示例 menc15a_1_get_speed_data();
+// 备注信息 执行该函数后,可直接使用返回值 也可以通过查询对应变量获取结果
+//-------------------------------------------------------------------------------------------------------------------
+int16 menc15a_get_speed_data(menc15a_module_enum menc15a_module)
+{
+ int16 read_data = 0;
+
+ if(menc15a_module == menc15a_1_module)
+ {
+ MENC15A_1_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_1_SPI, 0x8032);
+
+ MENC15A_1_CS(1);
+ }
+ else
+ {
+ MENC15A_2_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_2_SPI, 0x8032);
+
+ MENC15A_2_CS(1);
+ }
+
+ read_data = (read_data & 0x7fff);
+
+ if(read_data > 16384)
+ {
+ read_data = read_data - 32768;
+ }
+
+ menc15a_speed_data[menc15a_module] = (int16)((float)read_data * 1.917476f);
+
+ return menc15a_speed_data[menc15a_module];
+}
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 初始化 MENC15A
+// 参数说明 void
+// 返回参数 uint8 1-初始化失败 0-初始化成功
+// 使用示例 menc15a_init();
+// 备注信息
+//-------------------------------------------------------------------------------------------------------------------
+uint8 menc15a_init(void)
+{
+ spi_init(MENC15A_1_SPI, SPI_MODE1, MENC15A_1_SPI_SPEED, MENC15A_1_CLK_PIN, MENC15A_1_MOSI_PIN, MENC15A_1_MISO_PIN, SPI_CS_NULL); // 配置 MENC15A-1 的 SPI端口
+ gpio_init(MENC15A_1_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); // 配置 MENC15A-1 的 CS端口
+
+ spi_init(MENC15A_2_SPI, SPI_MODE1, MENC15A_2_SPI_SPEED, MENC15A_2_CLK_PIN, MENC15A_2_MOSI_PIN, MENC15A_2_MISO_PIN, SPI_CS_NULL); // 配置 MENC15A-2 的 SPI端口
+ gpio_init(MENC15A_2_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); // 配置 MENC15A-2 的 CS端口
+
+ return 0;
+}
+
diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_menc15a.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_menc15a.h
new file mode 100644
index 0000000..068d877
--- /dev/null
+++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_menc15a.h
@@ -0,0 +1,102 @@
+/*********************************************************************************************************************
+* CYT2BL3 Opensourec Library 即( CYT2BL3 开源库)是一个基于官方 SDK 接口的第三方开源库
+* Copyright (c) 2022 SEEKFREE 逐飞科技
+*
+* 本文件是 CYT2BL3 开源库的一部分
+*
+* CYT2BL3 开源库 是免费软件
+* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
+* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
+*
+* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
+* 甚至没有隐含的适销性或适合特定用途的保证
+* 更多细节请参见 GPL
+*
+* 您应该在收到本开源库的同时收到一份 GPL 的副本
+* 如果没有,请参阅
+*
+* 额外注明:
+* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
+* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
+* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
+* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
+*
+* 文件名称 zf_device_menc15a
+* 公司名称 成都逐飞科技有限公司
+* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
+* 开发环境 IAR 9.40.1
+* 适用平台 CYT2BL3
+* 店铺链接 https://seekfree.taobao.com/
+*
+* 修改记录
+* 日期 作者 备注
+* 2024-11-19 pudding first version
+********************************************************************************************************************/
+/*********************************************************************************************************************
+* 接线定义:
+* ------------------------------------
+* 模块管脚 单片机管脚
+* // 硬件 SPI 引脚
+* CLK 查看 zf_device_menc15a.h 中 MENC15A_CLK_PIN 宏定义
+* MOSI 查看 zf_device_menc15a.h 中 MENC15A_MOSI_PIN 宏定义
+* MISO 查看 zf_device_menc15a.h 中 MENC15A_MISO_PIN 宏定义
+* CS 查看 zf_device_menc15a.h 中 MENC15A_CS_PIN 宏定义
+* VCC 3.3V电源
+* GND 电源地
+* 其余引脚悬空
+* ------------------------------------
+********************************************************************************************************************/
+
+
+#ifndef _zf_device_menc15a_h_
+#define _zf_device_menc15a_h_
+
+#include "zf_common_typedef.h"
+
+//================================================定义 MENC15A 基本配置================================================
+
+//====================================================硬件 SPI 驱动====================================================
+#define MENC15A_1_SPI_SPEED (20 * 1000 * 1000) // 磁编码器1 硬件 SPI 速率
+#define MENC15A_1_SPI (SPI_0 ) // 磁编码器1 硬件 SPI 号
+#define MENC15A_1_CLK_PIN (SPI0_SCLK_P20_11) // 磁编码器1 硬件 SPI SCK 引脚
+#define MENC15A_1_MOSI_PIN (SPI0_MOSI_P20_14) // 磁编码器1 硬件 SPI MOSI 引脚
+#define MENC15A_1_MISO_PIN (SPI0_MISO_P20_12) // 磁编码器1 硬件 SPI MISO 引脚
+#define MENC15A_1_CS_PIN (P20_13) // 磁编码器1 CS 片选引脚
+#define MENC15A_1_CS(x) ((x) ? (gpio_high(MENC15A_1_CS_PIN)) : (gpio_low(MENC15A_1_CS_PIN)))
+
+
+#define MENC15A_2_SPI_SPEED (20 * 1000 * 1000) // 磁编码器2 硬件 SPI 速率
+#define MENC15A_2_SPI (SPI_0 ) // 磁编码器2 硬件 SPI 号
+#define MENC15A_2_CLK_PIN (SPI0_SCLK_P20_11 ) // 磁编码器2 硬件 SPI SCK 引脚
+#define MENC15A_2_MOSI_PIN (SPI0_MOSI_P20_14 ) // 磁编码器2 硬件 SPI MOSI 引脚
+#define MENC15A_2_MISO_PIN (SPI0_MISO_P20_12 ) // 磁编码器2 硬件 SPI MISO 引脚
+#define MENC15A_2_CS_PIN (P20_15) // 磁编码器2 CS 片选引脚
+#define MENC15A_2_CS(x) ((x) ? (gpio_high(MENC15A_2_CS_PIN)) : (gpio_low(MENC15A_2_CS_PIN)))
+
+//====================================================硬件 SPI 驱动====================================================
+
+// 枚举磁编码模块
+typedef enum
+{
+ menc15a_1_module,
+ menc15a_2_module,
+
+}menc15a_module_enum;
+
+//================================================定义 MENC15A 基本配置================================================
+
+
+extern uint16 menc15a_absolute_data[2];
+
+extern int16 menc15a_absolute_offset_data[2];
+
+extern int16 menc15a_speed_data[2];
+
+
+uint16 menc15a_get_absolute_data(menc15a_module_enum menc15a_module);
+int16 menc15a_get_speed_data(menc15a_module_enum menc15a_module);
+
+uint8 menc15a_init(void);
+
+
+#endif
diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_uart_receiver.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_uart_receiver.c
index 3ebb3bd..ade446d 100644
--- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_uart_receiver.c
+++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_uart_receiver.c
@@ -91,7 +91,7 @@ static void uart_receiver_analysis (uart_receiver_struct *remote_data,uint8 * bu
remote_data->channel[num++] = (buffer[5] >> 1 | buffer[6] << 7 ) & 0x07FF;
remote_data->channel[num++] = (buffer[6] >> 4 | buffer[7] << 4 ) & 0x07FF;
remote_data->channel[num++] = (buffer[7] >> 7 | buffer[8] << 1 | buffer[9] << 9 ) & 0x07FF;
- remote_data->state = (SBUS_NORMAL_STATE == buffer[23]) ? 1 : 0;
+ remote_data->state = (SBUS_ABNORMAL_STATE == (buffer[23] & SBUS_ABNORMAL_STATE)) ? 0 : 1;
uart_receiver.finsh_flag = 1;
}
diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_uart_receiver.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_uart_receiver.h
index 948ab2f..6498dcb 100644
--- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_uart_receiver.h
+++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_uart_receiver.h
@@ -55,8 +55,7 @@
#define REV_DATA_LEN ( 25 ) // SBUS帧长
#define FRAME_STAR ( 0X0F ) // 帧头信息
#define FRAME_END ( 0X00 ) // 帧尾信息
-#define SBUS_NORMAL_STATE ( 0X03 ) // 正常状态
-#define SBUS_ABNORMAL_STATE ( 0X0F ) // 失控状态
+#define SBUS_ABNORMAL_STATE ( 0X04 ) // 失控状态
typedef struct
{
diff --git a/Example/E08_eeprom_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt b/Example/E08_eeprom_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
index 1c96965..40d9e28 100644
--- a/Example/E08_eeprom_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
+++ b/Example/E08_eeprom_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
@@ -88,6 +88,8 @@ zf_device_uart_receiver.h SUBS
zf_device_absolute_encoder.h 360° 位置传感器 绝对式迷你 mini 编码器 分辨率:0.088°
+zf_device_menc15a.h 15位高精度磁编码器驱动 位置式
+
zf_device_gnss.h GPS 及 RTK 定位模块 双频高精度定位模块 亚米级定位
zf_device_key.h GPIO 按键驱动 用于检测主板按键状态
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 f817dd9..d74841c 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
@@ -766,11 +766,11 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name
IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕 首次发送数据 此时接收缓冲区无数据
IfxQspi_writeTransmitFifo(moudle, (uint8)(register_name & 0x00FF)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 1); // 等待接收完毕 再次发送数据 此时接收缓冲区有1个数据
spi_clear_fifo(moudle); // 清除接收缓存区
@@ -818,11 +818,11 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name,
IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕 首次发送数据 此时接收缓冲区无数据
IfxQspi_writeTransmitFifo(moudle, (uint8)(register_name & 0x00FF)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 1); // 等待接收完毕 再次发送数据 此时接收缓冲区有1个数据
spi_clear_fifo(moudle); // 清除接收缓存区
diff --git a/Example/E09_timer_demo/libraries/doc/version.txt b/Example/E09_timer_demo/libraries/doc/version.txt
index f45bf81..4df6214 100644
--- a/Example/E09_timer_demo/libraries/doc/version.txt
+++ b/Example/E09_timer_demo/libraries/doc/version.txt
@@ -1,3 +1,7 @@
+V3.3.2
+ 新增zf_device_menc15a磁编码器外设驱动
+ 更改uart接收机部分语句
+ 修正SPI的16位通讯错位问题
V3.3.1
移除正交编码器的断言检测
新增重命名工程工具
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 3a140e3..c8f75f2 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
@@ -93,6 +93,7 @@
#include "zf_device_ips114.h"
#include "zf_device_ips200.h"
#include "zf_device_key.h"
+#include "zf_device_menc15a.h"
#include "zf_device_mpu6050.h"
#include "zf_device_mt9v03x.h"
#include "zf_device_oled.h"
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 cc42e43..adfc4a3 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
@@ -91,8 +91,10 @@ ZF_WEAK void seekfree_assistant_interface_init (seekfree_assistant_transfer_devi
{
case SEEKFREE_ASSISTANT_DEBUG_UART:
{
+#if DEBUG_UART_USE_INTERRUPT == 1
seekfree_assistant_transfer_callback = debug_send_buffer;
seekfree_assistant_receive_callback = debug_read_ring_buffer;
+#endif
}break;
case SEEKFREE_ASSISTANT_WIRELESS_UART:
diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_menc15a.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_menc15a.c
new file mode 100644
index 0000000..faaeba2
--- /dev/null
+++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_menc15a.c
@@ -0,0 +1,188 @@
+/*********************************************************************************************************************
+* CYT2BL3 Opensourec Library 即( CYT2BL3 开源库)是一个基于官方 SDK 接口的第三方开源库
+* Copyright (c) 2022 SEEKFREE 逐飞科技
+*
+* 本文件是 CYT2BL3 开源库的一部分
+*
+* CYT2BL3 开源库 是免费软件
+* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
+* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
+*
+* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
+* 甚至没有隐含的适销性或适合特定用途的保证
+* 更多细节请参见 GPL
+*
+* 您应该在收到本开源库的同时收到一份 GPL 的副本
+* 如果没有,请参阅
+*
+* 额外注明:
+* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
+* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
+* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
+* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
+*
+* 文件名称 zf_device_menc15a
+* 公司名称 成都逐飞科技有限公司
+* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
+* 开发环境 IAR 9.40.1
+* 适用平台 CYT2BL3
+* 店铺链接 https://seekfree.taobao.com/
+*
+* 修改记录
+* 日期 作者 备注
+* 2024-11-19 pudding first version
+********************************************************************************************************************/
+/*********************************************************************************************************************
+* 接线定义:
+* ------------------------------------
+* 模块管脚 单片机管脚
+* // 硬件 SPI 引脚
+* SCL/SPC 查看 zf_device_menc15a.h 中 MENC15A_SPC_PIN 宏定义
+* SDA/DSI 查看 zf_device_menc15a.h 中 MENC15A_SDI_PIN 宏定义
+* SA0/SDO 查看 zf_device_menc15a.h 中 MENC15A_SDO_PIN 宏定义
+* CS 查看 zf_device_menc15a.h 中 MENC15A_CS_PIN 宏定义
+* VCC 3.3V电源
+* GND 电源地
+* 其余引脚悬空
+* ------------------------------------
+********************************************************************************************************************/
+
+#include "zf_common_debug.h"
+#include "zf_common_function.h"
+#include "zf_device_config.h"
+#include "zf_driver_delay.h"
+#include "zf_driver_gpio.h"
+#include "zf_driver_spi.h"
+
+#include "zf_device_menc15a.h"
+
+uint16 menc15a_absolute_data[2] = {0};
+
+int16 menc15a_absolute_offset_data[2] = {0};
+
+int16 menc15a_speed_data[2] = {0};
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 计算编码器旋转偏差
+// 参数说明 encoder_max 编码器精度 填写十进制数据
+// 参数说明 now_location 当前位置信息
+// 参数说明 last_location 上一次的位置信息
+// 返回参数 int32 计算的偏差值
+// 使用示例 magnetic_encoder_get_offset();
+// 备注信息
+//-------------------------------------------------------------------------------------------------------------------
+static int32 magnetic_encoder_get_offset (int32 encoder_max, int32 now_location, int32 last_location)
+{
+ int32 result_data = 0;
+
+ if((encoder_max / 2) < func_abs(now_location - last_location))
+ {
+ result_data = ((encoder_max / 2) < now_location ? (now_location - encoder_max - last_location) : (now_location + encoder_max - last_location));
+ }
+ else
+ {
+ result_data = (now_location - last_location);
+ }
+
+ return result_data;
+}
+
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 获取 MENC15A 磁编码器 的 绝对值 角度数据
+// 参数说明 menc15a_module 磁编码器 模块号
+// 返回参数 uint16 绝对值 角度数据
+// 使用示例 menc15a_1_get_absolute_data();
+// 备注信息 执行该函数后,可直接使用返回值 也可以通过查询对应变量获取结果
+//-------------------------------------------------------------------------------------------------------------------
+uint16 menc15a_get_absolute_data(menc15a_module_enum menc15a_module)
+{
+ uint16 read_data = 0;
+
+ uint16 data_last = menc15a_absolute_data[menc15a_module];
+
+ if(menc15a_module == menc15a_1_module)
+ {
+ MENC15A_1_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_1_SPI, 0x8021);
+
+ MENC15A_1_CS(1);
+ }
+ else
+ {
+ MENC15A_2_CS(0);
+
+ spi_write_8bit(MENC15A_2_SPI, 0x80);
+ spi_write_8bit(MENC15A_2_SPI, 0x21);
+ read_data = spi_read_8bit(MENC15A_2_SPI);
+ read_data = ((read_data << 8) | spi_read_8bit(MENC15A_2_SPI));
+
+ MENC15A_2_CS(1);
+ }
+
+ menc15a_absolute_data[menc15a_module] = (read_data & 0x7fff);
+
+ menc15a_absolute_offset_data[menc15a_module] = (int16)magnetic_encoder_get_offset(32768, menc15a_absolute_data[menc15a_module], data_last);
+
+ return menc15a_absolute_data[menc15a_module];
+}
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 获取 MENC15A 磁编码器 的 转速数据
+// 参数说明 menc15a_module 磁编码器 模块号
+// 返回参数 int16 转速数据(每秒旋转弧度 rad/s)
+// 使用示例 menc15a_1_get_speed_data();
+// 备注信息 执行该函数后,可直接使用返回值 也可以通过查询对应变量获取结果
+//-------------------------------------------------------------------------------------------------------------------
+int16 menc15a_get_speed_data(menc15a_module_enum menc15a_module)
+{
+ int16 read_data = 0;
+
+ if(menc15a_module == menc15a_1_module)
+ {
+ MENC15A_1_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_1_SPI, 0x8032);
+
+ MENC15A_1_CS(1);
+ }
+ else
+ {
+ MENC15A_2_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_2_SPI, 0x8032);
+
+ MENC15A_2_CS(1);
+ }
+
+ read_data = (read_data & 0x7fff);
+
+ if(read_data > 16384)
+ {
+ read_data = read_data - 32768;
+ }
+
+ menc15a_speed_data[menc15a_module] = (int16)((float)read_data * 1.917476f);
+
+ return menc15a_speed_data[menc15a_module];
+}
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 初始化 MENC15A
+// 参数说明 void
+// 返回参数 uint8 1-初始化失败 0-初始化成功
+// 使用示例 menc15a_init();
+// 备注信息
+//-------------------------------------------------------------------------------------------------------------------
+uint8 menc15a_init(void)
+{
+ spi_init(MENC15A_1_SPI, SPI_MODE1, MENC15A_1_SPI_SPEED, MENC15A_1_CLK_PIN, MENC15A_1_MOSI_PIN, MENC15A_1_MISO_PIN, SPI_CS_NULL); // 配置 MENC15A-1 的 SPI端口
+ gpio_init(MENC15A_1_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); // 配置 MENC15A-1 的 CS端口
+
+ spi_init(MENC15A_2_SPI, SPI_MODE1, MENC15A_2_SPI_SPEED, MENC15A_2_CLK_PIN, MENC15A_2_MOSI_PIN, MENC15A_2_MISO_PIN, SPI_CS_NULL); // 配置 MENC15A-2 的 SPI端口
+ gpio_init(MENC15A_2_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); // 配置 MENC15A-2 的 CS端口
+
+ return 0;
+}
+
diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_menc15a.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_menc15a.h
new file mode 100644
index 0000000..068d877
--- /dev/null
+++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_menc15a.h
@@ -0,0 +1,102 @@
+/*********************************************************************************************************************
+* CYT2BL3 Opensourec Library 即( CYT2BL3 开源库)是一个基于官方 SDK 接口的第三方开源库
+* Copyright (c) 2022 SEEKFREE 逐飞科技
+*
+* 本文件是 CYT2BL3 开源库的一部分
+*
+* CYT2BL3 开源库 是免费软件
+* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
+* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
+*
+* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
+* 甚至没有隐含的适销性或适合特定用途的保证
+* 更多细节请参见 GPL
+*
+* 您应该在收到本开源库的同时收到一份 GPL 的副本
+* 如果没有,请参阅
+*
+* 额外注明:
+* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
+* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
+* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
+* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
+*
+* 文件名称 zf_device_menc15a
+* 公司名称 成都逐飞科技有限公司
+* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
+* 开发环境 IAR 9.40.1
+* 适用平台 CYT2BL3
+* 店铺链接 https://seekfree.taobao.com/
+*
+* 修改记录
+* 日期 作者 备注
+* 2024-11-19 pudding first version
+********************************************************************************************************************/
+/*********************************************************************************************************************
+* 接线定义:
+* ------------------------------------
+* 模块管脚 单片机管脚
+* // 硬件 SPI 引脚
+* CLK 查看 zf_device_menc15a.h 中 MENC15A_CLK_PIN 宏定义
+* MOSI 查看 zf_device_menc15a.h 中 MENC15A_MOSI_PIN 宏定义
+* MISO 查看 zf_device_menc15a.h 中 MENC15A_MISO_PIN 宏定义
+* CS 查看 zf_device_menc15a.h 中 MENC15A_CS_PIN 宏定义
+* VCC 3.3V电源
+* GND 电源地
+* 其余引脚悬空
+* ------------------------------------
+********************************************************************************************************************/
+
+
+#ifndef _zf_device_menc15a_h_
+#define _zf_device_menc15a_h_
+
+#include "zf_common_typedef.h"
+
+//================================================定义 MENC15A 基本配置================================================
+
+//====================================================硬件 SPI 驱动====================================================
+#define MENC15A_1_SPI_SPEED (20 * 1000 * 1000) // 磁编码器1 硬件 SPI 速率
+#define MENC15A_1_SPI (SPI_0 ) // 磁编码器1 硬件 SPI 号
+#define MENC15A_1_CLK_PIN (SPI0_SCLK_P20_11) // 磁编码器1 硬件 SPI SCK 引脚
+#define MENC15A_1_MOSI_PIN (SPI0_MOSI_P20_14) // 磁编码器1 硬件 SPI MOSI 引脚
+#define MENC15A_1_MISO_PIN (SPI0_MISO_P20_12) // 磁编码器1 硬件 SPI MISO 引脚
+#define MENC15A_1_CS_PIN (P20_13) // 磁编码器1 CS 片选引脚
+#define MENC15A_1_CS(x) ((x) ? (gpio_high(MENC15A_1_CS_PIN)) : (gpio_low(MENC15A_1_CS_PIN)))
+
+
+#define MENC15A_2_SPI_SPEED (20 * 1000 * 1000) // 磁编码器2 硬件 SPI 速率
+#define MENC15A_2_SPI (SPI_0 ) // 磁编码器2 硬件 SPI 号
+#define MENC15A_2_CLK_PIN (SPI0_SCLK_P20_11 ) // 磁编码器2 硬件 SPI SCK 引脚
+#define MENC15A_2_MOSI_PIN (SPI0_MOSI_P20_14 ) // 磁编码器2 硬件 SPI MOSI 引脚
+#define MENC15A_2_MISO_PIN (SPI0_MISO_P20_12 ) // 磁编码器2 硬件 SPI MISO 引脚
+#define MENC15A_2_CS_PIN (P20_15) // 磁编码器2 CS 片选引脚
+#define MENC15A_2_CS(x) ((x) ? (gpio_high(MENC15A_2_CS_PIN)) : (gpio_low(MENC15A_2_CS_PIN)))
+
+//====================================================硬件 SPI 驱动====================================================
+
+// 枚举磁编码模块
+typedef enum
+{
+ menc15a_1_module,
+ menc15a_2_module,
+
+}menc15a_module_enum;
+
+//================================================定义 MENC15A 基本配置================================================
+
+
+extern uint16 menc15a_absolute_data[2];
+
+extern int16 menc15a_absolute_offset_data[2];
+
+extern int16 menc15a_speed_data[2];
+
+
+uint16 menc15a_get_absolute_data(menc15a_module_enum menc15a_module);
+int16 menc15a_get_speed_data(menc15a_module_enum menc15a_module);
+
+uint8 menc15a_init(void);
+
+
+#endif
diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_uart_receiver.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_uart_receiver.c
index 3ebb3bd..ade446d 100644
--- a/Example/E09_timer_demo/libraries/zf_device/zf_device_uart_receiver.c
+++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_uart_receiver.c
@@ -91,7 +91,7 @@ static void uart_receiver_analysis (uart_receiver_struct *remote_data,uint8 * bu
remote_data->channel[num++] = (buffer[5] >> 1 | buffer[6] << 7 ) & 0x07FF;
remote_data->channel[num++] = (buffer[6] >> 4 | buffer[7] << 4 ) & 0x07FF;
remote_data->channel[num++] = (buffer[7] >> 7 | buffer[8] << 1 | buffer[9] << 9 ) & 0x07FF;
- remote_data->state = (SBUS_NORMAL_STATE == buffer[23]) ? 1 : 0;
+ remote_data->state = (SBUS_ABNORMAL_STATE == (buffer[23] & SBUS_ABNORMAL_STATE)) ? 0 : 1;
uart_receiver.finsh_flag = 1;
}
diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_uart_receiver.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_uart_receiver.h
index 948ab2f..6498dcb 100644
--- a/Example/E09_timer_demo/libraries/zf_device/zf_device_uart_receiver.h
+++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_uart_receiver.h
@@ -55,8 +55,7 @@
#define REV_DATA_LEN ( 25 ) // SBUS帧长
#define FRAME_STAR ( 0X0F ) // 帧头信息
#define FRAME_END ( 0X00 ) // 帧尾信息
-#define SBUS_NORMAL_STATE ( 0X03 ) // 正常状态
-#define SBUS_ABNORMAL_STATE ( 0X0F ) // 失控状态
+#define SBUS_ABNORMAL_STATE ( 0X04 ) // 失控状态
typedef struct
{
diff --git a/Example/E09_timer_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt b/Example/E09_timer_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
index 1c96965..40d9e28 100644
--- a/Example/E09_timer_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
+++ b/Example/E09_timer_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
@@ -88,6 +88,8 @@ zf_device_uart_receiver.h SUBS
zf_device_absolute_encoder.h 360° 位置传感器 绝对式迷你 mini 编码器 分辨率:0.088°
+zf_device_menc15a.h 15位高精度磁编码器驱动 位置式
+
zf_device_gnss.h GPS 及 RTK 定位模块 双频高精度定位模块 亚米级定位
zf_device_key.h GPIO 按键驱动 用于检测主板按键状态
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 f817dd9..d74841c 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
@@ -766,11 +766,11 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name
IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕 首次发送数据 此时接收缓冲区无数据
IfxQspi_writeTransmitFifo(moudle, (uint8)(register_name & 0x00FF)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 1); // 等待接收完毕 再次发送数据 此时接收缓冲区有1个数据
spi_clear_fifo(moudle); // 清除接收缓存区
@@ -818,11 +818,11 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name,
IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕 首次发送数据 此时接收缓冲区无数据
IfxQspi_writeTransmitFifo(moudle, (uint8)(register_name & 0x00FF)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 1); // 等待接收完毕 再次发送数据 此时接收缓冲区有1个数据
spi_clear_fifo(moudle); // 清除接收缓存区
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 f45bf81..4df6214 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,7 @@
+V3.3.2
+ 新增zf_device_menc15a磁编码器外设驱动
+ 更改uart接收机部分语句
+ 修正SPI的16位通讯错位问题
V3.3.1
移除正交编码器的断言检测
新增重命名工程工具
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 3a140e3..c8f75f2 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
@@ -93,6 +93,7 @@
#include "zf_device_ips114.h"
#include "zf_device_ips200.h"
#include "zf_device_key.h"
+#include "zf_device_menc15a.h"
#include "zf_device_mpu6050.h"
#include "zf_device_mt9v03x.h"
#include "zf_device_oled.h"
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 cc42e43..adfc4a3 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
@@ -91,8 +91,10 @@ ZF_WEAK void seekfree_assistant_interface_init (seekfree_assistant_transfer_devi
{
case SEEKFREE_ASSISTANT_DEBUG_UART:
{
+#if DEBUG_UART_USE_INTERRUPT == 1
seekfree_assistant_transfer_callback = debug_send_buffer;
seekfree_assistant_receive_callback = debug_read_ring_buffer;
+#endif
}break;
case SEEKFREE_ASSISTANT_WIRELESS_UART:
diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_menc15a.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_menc15a.c
new file mode 100644
index 0000000..faaeba2
--- /dev/null
+++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_menc15a.c
@@ -0,0 +1,188 @@
+/*********************************************************************************************************************
+* CYT2BL3 Opensourec Library 即( CYT2BL3 开源库)是一个基于官方 SDK 接口的第三方开源库
+* Copyright (c) 2022 SEEKFREE 逐飞科技
+*
+* 本文件是 CYT2BL3 开源库的一部分
+*
+* CYT2BL3 开源库 是免费软件
+* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
+* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
+*
+* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
+* 甚至没有隐含的适销性或适合特定用途的保证
+* 更多细节请参见 GPL
+*
+* 您应该在收到本开源库的同时收到一份 GPL 的副本
+* 如果没有,请参阅
+*
+* 额外注明:
+* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
+* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
+* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
+* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
+*
+* 文件名称 zf_device_menc15a
+* 公司名称 成都逐飞科技有限公司
+* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
+* 开发环境 IAR 9.40.1
+* 适用平台 CYT2BL3
+* 店铺链接 https://seekfree.taobao.com/
+*
+* 修改记录
+* 日期 作者 备注
+* 2024-11-19 pudding first version
+********************************************************************************************************************/
+/*********************************************************************************************************************
+* 接线定义:
+* ------------------------------------
+* 模块管脚 单片机管脚
+* // 硬件 SPI 引脚
+* SCL/SPC 查看 zf_device_menc15a.h 中 MENC15A_SPC_PIN 宏定义
+* SDA/DSI 查看 zf_device_menc15a.h 中 MENC15A_SDI_PIN 宏定义
+* SA0/SDO 查看 zf_device_menc15a.h 中 MENC15A_SDO_PIN 宏定义
+* CS 查看 zf_device_menc15a.h 中 MENC15A_CS_PIN 宏定义
+* VCC 3.3V电源
+* GND 电源地
+* 其余引脚悬空
+* ------------------------------------
+********************************************************************************************************************/
+
+#include "zf_common_debug.h"
+#include "zf_common_function.h"
+#include "zf_device_config.h"
+#include "zf_driver_delay.h"
+#include "zf_driver_gpio.h"
+#include "zf_driver_spi.h"
+
+#include "zf_device_menc15a.h"
+
+uint16 menc15a_absolute_data[2] = {0};
+
+int16 menc15a_absolute_offset_data[2] = {0};
+
+int16 menc15a_speed_data[2] = {0};
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 计算编码器旋转偏差
+// 参数说明 encoder_max 编码器精度 填写十进制数据
+// 参数说明 now_location 当前位置信息
+// 参数说明 last_location 上一次的位置信息
+// 返回参数 int32 计算的偏差值
+// 使用示例 magnetic_encoder_get_offset();
+// 备注信息
+//-------------------------------------------------------------------------------------------------------------------
+static int32 magnetic_encoder_get_offset (int32 encoder_max, int32 now_location, int32 last_location)
+{
+ int32 result_data = 0;
+
+ if((encoder_max / 2) < func_abs(now_location - last_location))
+ {
+ result_data = ((encoder_max / 2) < now_location ? (now_location - encoder_max - last_location) : (now_location + encoder_max - last_location));
+ }
+ else
+ {
+ result_data = (now_location - last_location);
+ }
+
+ return result_data;
+}
+
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 获取 MENC15A 磁编码器 的 绝对值 角度数据
+// 参数说明 menc15a_module 磁编码器 模块号
+// 返回参数 uint16 绝对值 角度数据
+// 使用示例 menc15a_1_get_absolute_data();
+// 备注信息 执行该函数后,可直接使用返回值 也可以通过查询对应变量获取结果
+//-------------------------------------------------------------------------------------------------------------------
+uint16 menc15a_get_absolute_data(menc15a_module_enum menc15a_module)
+{
+ uint16 read_data = 0;
+
+ uint16 data_last = menc15a_absolute_data[menc15a_module];
+
+ if(menc15a_module == menc15a_1_module)
+ {
+ MENC15A_1_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_1_SPI, 0x8021);
+
+ MENC15A_1_CS(1);
+ }
+ else
+ {
+ MENC15A_2_CS(0);
+
+ spi_write_8bit(MENC15A_2_SPI, 0x80);
+ spi_write_8bit(MENC15A_2_SPI, 0x21);
+ read_data = spi_read_8bit(MENC15A_2_SPI);
+ read_data = ((read_data << 8) | spi_read_8bit(MENC15A_2_SPI));
+
+ MENC15A_2_CS(1);
+ }
+
+ menc15a_absolute_data[menc15a_module] = (read_data & 0x7fff);
+
+ menc15a_absolute_offset_data[menc15a_module] = (int16)magnetic_encoder_get_offset(32768, menc15a_absolute_data[menc15a_module], data_last);
+
+ return menc15a_absolute_data[menc15a_module];
+}
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 获取 MENC15A 磁编码器 的 转速数据
+// 参数说明 menc15a_module 磁编码器 模块号
+// 返回参数 int16 转速数据(每秒旋转弧度 rad/s)
+// 使用示例 menc15a_1_get_speed_data();
+// 备注信息 执行该函数后,可直接使用返回值 也可以通过查询对应变量获取结果
+//-------------------------------------------------------------------------------------------------------------------
+int16 menc15a_get_speed_data(menc15a_module_enum menc15a_module)
+{
+ int16 read_data = 0;
+
+ if(menc15a_module == menc15a_1_module)
+ {
+ MENC15A_1_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_1_SPI, 0x8032);
+
+ MENC15A_1_CS(1);
+ }
+ else
+ {
+ MENC15A_2_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_2_SPI, 0x8032);
+
+ MENC15A_2_CS(1);
+ }
+
+ read_data = (read_data & 0x7fff);
+
+ if(read_data > 16384)
+ {
+ read_data = read_data - 32768;
+ }
+
+ menc15a_speed_data[menc15a_module] = (int16)((float)read_data * 1.917476f);
+
+ return menc15a_speed_data[menc15a_module];
+}
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 初始化 MENC15A
+// 参数说明 void
+// 返回参数 uint8 1-初始化失败 0-初始化成功
+// 使用示例 menc15a_init();
+// 备注信息
+//-------------------------------------------------------------------------------------------------------------------
+uint8 menc15a_init(void)
+{
+ spi_init(MENC15A_1_SPI, SPI_MODE1, MENC15A_1_SPI_SPEED, MENC15A_1_CLK_PIN, MENC15A_1_MOSI_PIN, MENC15A_1_MISO_PIN, SPI_CS_NULL); // 配置 MENC15A-1 的 SPI端口
+ gpio_init(MENC15A_1_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); // 配置 MENC15A-1 的 CS端口
+
+ spi_init(MENC15A_2_SPI, SPI_MODE1, MENC15A_2_SPI_SPEED, MENC15A_2_CLK_PIN, MENC15A_2_MOSI_PIN, MENC15A_2_MISO_PIN, SPI_CS_NULL); // 配置 MENC15A-2 的 SPI端口
+ gpio_init(MENC15A_2_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); // 配置 MENC15A-2 的 CS端口
+
+ return 0;
+}
+
diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_menc15a.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_menc15a.h
new file mode 100644
index 0000000..068d877
--- /dev/null
+++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_menc15a.h
@@ -0,0 +1,102 @@
+/*********************************************************************************************************************
+* CYT2BL3 Opensourec Library 即( CYT2BL3 开源库)是一个基于官方 SDK 接口的第三方开源库
+* Copyright (c) 2022 SEEKFREE 逐飞科技
+*
+* 本文件是 CYT2BL3 开源库的一部分
+*
+* CYT2BL3 开源库 是免费软件
+* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
+* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
+*
+* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
+* 甚至没有隐含的适销性或适合特定用途的保证
+* 更多细节请参见 GPL
+*
+* 您应该在收到本开源库的同时收到一份 GPL 的副本
+* 如果没有,请参阅
+*
+* 额外注明:
+* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
+* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
+* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
+* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
+*
+* 文件名称 zf_device_menc15a
+* 公司名称 成都逐飞科技有限公司
+* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
+* 开发环境 IAR 9.40.1
+* 适用平台 CYT2BL3
+* 店铺链接 https://seekfree.taobao.com/
+*
+* 修改记录
+* 日期 作者 备注
+* 2024-11-19 pudding first version
+********************************************************************************************************************/
+/*********************************************************************************************************************
+* 接线定义:
+* ------------------------------------
+* 模块管脚 单片机管脚
+* // 硬件 SPI 引脚
+* CLK 查看 zf_device_menc15a.h 中 MENC15A_CLK_PIN 宏定义
+* MOSI 查看 zf_device_menc15a.h 中 MENC15A_MOSI_PIN 宏定义
+* MISO 查看 zf_device_menc15a.h 中 MENC15A_MISO_PIN 宏定义
+* CS 查看 zf_device_menc15a.h 中 MENC15A_CS_PIN 宏定义
+* VCC 3.3V电源
+* GND 电源地
+* 其余引脚悬空
+* ------------------------------------
+********************************************************************************************************************/
+
+
+#ifndef _zf_device_menc15a_h_
+#define _zf_device_menc15a_h_
+
+#include "zf_common_typedef.h"
+
+//================================================定义 MENC15A 基本配置================================================
+
+//====================================================硬件 SPI 驱动====================================================
+#define MENC15A_1_SPI_SPEED (20 * 1000 * 1000) // 磁编码器1 硬件 SPI 速率
+#define MENC15A_1_SPI (SPI_0 ) // 磁编码器1 硬件 SPI 号
+#define MENC15A_1_CLK_PIN (SPI0_SCLK_P20_11) // 磁编码器1 硬件 SPI SCK 引脚
+#define MENC15A_1_MOSI_PIN (SPI0_MOSI_P20_14) // 磁编码器1 硬件 SPI MOSI 引脚
+#define MENC15A_1_MISO_PIN (SPI0_MISO_P20_12) // 磁编码器1 硬件 SPI MISO 引脚
+#define MENC15A_1_CS_PIN (P20_13) // 磁编码器1 CS 片选引脚
+#define MENC15A_1_CS(x) ((x) ? (gpio_high(MENC15A_1_CS_PIN)) : (gpio_low(MENC15A_1_CS_PIN)))
+
+
+#define MENC15A_2_SPI_SPEED (20 * 1000 * 1000) // 磁编码器2 硬件 SPI 速率
+#define MENC15A_2_SPI (SPI_0 ) // 磁编码器2 硬件 SPI 号
+#define MENC15A_2_CLK_PIN (SPI0_SCLK_P20_11 ) // 磁编码器2 硬件 SPI SCK 引脚
+#define MENC15A_2_MOSI_PIN (SPI0_MOSI_P20_14 ) // 磁编码器2 硬件 SPI MOSI 引脚
+#define MENC15A_2_MISO_PIN (SPI0_MISO_P20_12 ) // 磁编码器2 硬件 SPI MISO 引脚
+#define MENC15A_2_CS_PIN (P20_15) // 磁编码器2 CS 片选引脚
+#define MENC15A_2_CS(x) ((x) ? (gpio_high(MENC15A_2_CS_PIN)) : (gpio_low(MENC15A_2_CS_PIN)))
+
+//====================================================硬件 SPI 驱动====================================================
+
+// 枚举磁编码模块
+typedef enum
+{
+ menc15a_1_module,
+ menc15a_2_module,
+
+}menc15a_module_enum;
+
+//================================================定义 MENC15A 基本配置================================================
+
+
+extern uint16 menc15a_absolute_data[2];
+
+extern int16 menc15a_absolute_offset_data[2];
+
+extern int16 menc15a_speed_data[2];
+
+
+uint16 menc15a_get_absolute_data(menc15a_module_enum menc15a_module);
+int16 menc15a_get_speed_data(menc15a_module_enum menc15a_module);
+
+uint8 menc15a_init(void);
+
+
+#endif
diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_uart_receiver.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_uart_receiver.c
index 3ebb3bd..ade446d 100644
--- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_uart_receiver.c
+++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_uart_receiver.c
@@ -91,7 +91,7 @@ static void uart_receiver_analysis (uart_receiver_struct *remote_data,uint8 * bu
remote_data->channel[num++] = (buffer[5] >> 1 | buffer[6] << 7 ) & 0x07FF;
remote_data->channel[num++] = (buffer[6] >> 4 | buffer[7] << 4 ) & 0x07FF;
remote_data->channel[num++] = (buffer[7] >> 7 | buffer[8] << 1 | buffer[9] << 9 ) & 0x07FF;
- remote_data->state = (SBUS_NORMAL_STATE == buffer[23]) ? 1 : 0;
+ remote_data->state = (SBUS_ABNORMAL_STATE == (buffer[23] & SBUS_ABNORMAL_STATE)) ? 0 : 1;
uart_receiver.finsh_flag = 1;
}
diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_uart_receiver.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_uart_receiver.h
index 948ab2f..6498dcb 100644
--- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_uart_receiver.h
+++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_uart_receiver.h
@@ -55,8 +55,7 @@
#define REV_DATA_LEN ( 25 ) // SBUS帧长
#define FRAME_STAR ( 0X0F ) // 帧头信息
#define FRAME_END ( 0X00 ) // 帧尾信息
-#define SBUS_NORMAL_STATE ( 0X03 ) // 正常状态
-#define SBUS_ABNORMAL_STATE ( 0X0F ) // 失控状态
+#define SBUS_ABNORMAL_STATE ( 0X04 ) // 失控状态
typedef struct
{
diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt b/Example/E10_printf_debug_log_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
index 1c96965..40d9e28 100644
--- a/Example/E10_printf_debug_log_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
+++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
@@ -88,6 +88,8 @@ zf_device_uart_receiver.h SUBS
zf_device_absolute_encoder.h 360° 位置传感器 绝对式迷你 mini 编码器 分辨率:0.088°
+zf_device_menc15a.h 15位高精度磁编码器驱动 位置式
+
zf_device_gnss.h GPS 及 RTK 定位模块 双频高精度定位模块 亚米级定位
zf_device_key.h GPIO 按键驱动 用于检测主板按键状态
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 f817dd9..d74841c 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
@@ -766,11 +766,11 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name
IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕 首次发送数据 此时接收缓冲区无数据
IfxQspi_writeTransmitFifo(moudle, (uint8)(register_name & 0x00FF)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 1); // 等待接收完毕 再次发送数据 此时接收缓冲区有1个数据
spi_clear_fifo(moudle); // 清除接收缓存区
@@ -818,11 +818,11 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name,
IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕 首次发送数据 此时接收缓冲区无数据
IfxQspi_writeTransmitFifo(moudle, (uint8)(register_name & 0x00FF)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 1); // 等待接收完毕 再次发送数据 此时接收缓冲区有1个数据
spi_clear_fifo(moudle); // 清除接收缓存区
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 f45bf81..4df6214 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,7 @@
+V3.3.2
+ 新增zf_device_menc15a磁编码器外设驱动
+ 更改uart接收机部分语句
+ 修正SPI的16位通讯错位问题
V3.3.1
移除正交编码器的断言检测
新增重命名工程工具
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 3a140e3..c8f75f2 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
@@ -93,6 +93,7 @@
#include "zf_device_ips114.h"
#include "zf_device_ips200.h"
#include "zf_device_key.h"
+#include "zf_device_menc15a.h"
#include "zf_device_mpu6050.h"
#include "zf_device_mt9v03x.h"
#include "zf_device_oled.h"
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 cc42e43..adfc4a3 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
@@ -91,8 +91,10 @@ ZF_WEAK void seekfree_assistant_interface_init (seekfree_assistant_transfer_devi
{
case SEEKFREE_ASSISTANT_DEBUG_UART:
{
+#if DEBUG_UART_USE_INTERRUPT == 1
seekfree_assistant_transfer_callback = debug_send_buffer;
seekfree_assistant_receive_callback = debug_read_ring_buffer;
+#endif
}break;
case SEEKFREE_ASSISTANT_WIRELESS_UART:
diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_menc15a.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_menc15a.c
new file mode 100644
index 0000000..faaeba2
--- /dev/null
+++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_menc15a.c
@@ -0,0 +1,188 @@
+/*********************************************************************************************************************
+* CYT2BL3 Opensourec Library 即( CYT2BL3 开源库)是一个基于官方 SDK 接口的第三方开源库
+* Copyright (c) 2022 SEEKFREE 逐飞科技
+*
+* 本文件是 CYT2BL3 开源库的一部分
+*
+* CYT2BL3 开源库 是免费软件
+* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
+* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
+*
+* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
+* 甚至没有隐含的适销性或适合特定用途的保证
+* 更多细节请参见 GPL
+*
+* 您应该在收到本开源库的同时收到一份 GPL 的副本
+* 如果没有,请参阅
+*
+* 额外注明:
+* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
+* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
+* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
+* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
+*
+* 文件名称 zf_device_menc15a
+* 公司名称 成都逐飞科技有限公司
+* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
+* 开发环境 IAR 9.40.1
+* 适用平台 CYT2BL3
+* 店铺链接 https://seekfree.taobao.com/
+*
+* 修改记录
+* 日期 作者 备注
+* 2024-11-19 pudding first version
+********************************************************************************************************************/
+/*********************************************************************************************************************
+* 接线定义:
+* ------------------------------------
+* 模块管脚 单片机管脚
+* // 硬件 SPI 引脚
+* SCL/SPC 查看 zf_device_menc15a.h 中 MENC15A_SPC_PIN 宏定义
+* SDA/DSI 查看 zf_device_menc15a.h 中 MENC15A_SDI_PIN 宏定义
+* SA0/SDO 查看 zf_device_menc15a.h 中 MENC15A_SDO_PIN 宏定义
+* CS 查看 zf_device_menc15a.h 中 MENC15A_CS_PIN 宏定义
+* VCC 3.3V电源
+* GND 电源地
+* 其余引脚悬空
+* ------------------------------------
+********************************************************************************************************************/
+
+#include "zf_common_debug.h"
+#include "zf_common_function.h"
+#include "zf_device_config.h"
+#include "zf_driver_delay.h"
+#include "zf_driver_gpio.h"
+#include "zf_driver_spi.h"
+
+#include "zf_device_menc15a.h"
+
+uint16 menc15a_absolute_data[2] = {0};
+
+int16 menc15a_absolute_offset_data[2] = {0};
+
+int16 menc15a_speed_data[2] = {0};
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 计算编码器旋转偏差
+// 参数说明 encoder_max 编码器精度 填写十进制数据
+// 参数说明 now_location 当前位置信息
+// 参数说明 last_location 上一次的位置信息
+// 返回参数 int32 计算的偏差值
+// 使用示例 magnetic_encoder_get_offset();
+// 备注信息
+//-------------------------------------------------------------------------------------------------------------------
+static int32 magnetic_encoder_get_offset (int32 encoder_max, int32 now_location, int32 last_location)
+{
+ int32 result_data = 0;
+
+ if((encoder_max / 2) < func_abs(now_location - last_location))
+ {
+ result_data = ((encoder_max / 2) < now_location ? (now_location - encoder_max - last_location) : (now_location + encoder_max - last_location));
+ }
+ else
+ {
+ result_data = (now_location - last_location);
+ }
+
+ return result_data;
+}
+
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 获取 MENC15A 磁编码器 的 绝对值 角度数据
+// 参数说明 menc15a_module 磁编码器 模块号
+// 返回参数 uint16 绝对值 角度数据
+// 使用示例 menc15a_1_get_absolute_data();
+// 备注信息 执行该函数后,可直接使用返回值 也可以通过查询对应变量获取结果
+//-------------------------------------------------------------------------------------------------------------------
+uint16 menc15a_get_absolute_data(menc15a_module_enum menc15a_module)
+{
+ uint16 read_data = 0;
+
+ uint16 data_last = menc15a_absolute_data[menc15a_module];
+
+ if(menc15a_module == menc15a_1_module)
+ {
+ MENC15A_1_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_1_SPI, 0x8021);
+
+ MENC15A_1_CS(1);
+ }
+ else
+ {
+ MENC15A_2_CS(0);
+
+ spi_write_8bit(MENC15A_2_SPI, 0x80);
+ spi_write_8bit(MENC15A_2_SPI, 0x21);
+ read_data = spi_read_8bit(MENC15A_2_SPI);
+ read_data = ((read_data << 8) | spi_read_8bit(MENC15A_2_SPI));
+
+ MENC15A_2_CS(1);
+ }
+
+ menc15a_absolute_data[menc15a_module] = (read_data & 0x7fff);
+
+ menc15a_absolute_offset_data[menc15a_module] = (int16)magnetic_encoder_get_offset(32768, menc15a_absolute_data[menc15a_module], data_last);
+
+ return menc15a_absolute_data[menc15a_module];
+}
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 获取 MENC15A 磁编码器 的 转速数据
+// 参数说明 menc15a_module 磁编码器 模块号
+// 返回参数 int16 转速数据(每秒旋转弧度 rad/s)
+// 使用示例 menc15a_1_get_speed_data();
+// 备注信息 执行该函数后,可直接使用返回值 也可以通过查询对应变量获取结果
+//-------------------------------------------------------------------------------------------------------------------
+int16 menc15a_get_speed_data(menc15a_module_enum menc15a_module)
+{
+ int16 read_data = 0;
+
+ if(menc15a_module == menc15a_1_module)
+ {
+ MENC15A_1_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_1_SPI, 0x8032);
+
+ MENC15A_1_CS(1);
+ }
+ else
+ {
+ MENC15A_2_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_2_SPI, 0x8032);
+
+ MENC15A_2_CS(1);
+ }
+
+ read_data = (read_data & 0x7fff);
+
+ if(read_data > 16384)
+ {
+ read_data = read_data - 32768;
+ }
+
+ menc15a_speed_data[menc15a_module] = (int16)((float)read_data * 1.917476f);
+
+ return menc15a_speed_data[menc15a_module];
+}
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 初始化 MENC15A
+// 参数说明 void
+// 返回参数 uint8 1-初始化失败 0-初始化成功
+// 使用示例 menc15a_init();
+// 备注信息
+//-------------------------------------------------------------------------------------------------------------------
+uint8 menc15a_init(void)
+{
+ spi_init(MENC15A_1_SPI, SPI_MODE1, MENC15A_1_SPI_SPEED, MENC15A_1_CLK_PIN, MENC15A_1_MOSI_PIN, MENC15A_1_MISO_PIN, SPI_CS_NULL); // 配置 MENC15A-1 的 SPI端口
+ gpio_init(MENC15A_1_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); // 配置 MENC15A-1 的 CS端口
+
+ spi_init(MENC15A_2_SPI, SPI_MODE1, MENC15A_2_SPI_SPEED, MENC15A_2_CLK_PIN, MENC15A_2_MOSI_PIN, MENC15A_2_MISO_PIN, SPI_CS_NULL); // 配置 MENC15A-2 的 SPI端口
+ gpio_init(MENC15A_2_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); // 配置 MENC15A-2 的 CS端口
+
+ return 0;
+}
+
diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_menc15a.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_menc15a.h
new file mode 100644
index 0000000..068d877
--- /dev/null
+++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_menc15a.h
@@ -0,0 +1,102 @@
+/*********************************************************************************************************************
+* CYT2BL3 Opensourec Library 即( CYT2BL3 开源库)是一个基于官方 SDK 接口的第三方开源库
+* Copyright (c) 2022 SEEKFREE 逐飞科技
+*
+* 本文件是 CYT2BL3 开源库的一部分
+*
+* CYT2BL3 开源库 是免费软件
+* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
+* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
+*
+* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
+* 甚至没有隐含的适销性或适合特定用途的保证
+* 更多细节请参见 GPL
+*
+* 您应该在收到本开源库的同时收到一份 GPL 的副本
+* 如果没有,请参阅
+*
+* 额外注明:
+* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
+* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
+* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
+* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
+*
+* 文件名称 zf_device_menc15a
+* 公司名称 成都逐飞科技有限公司
+* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
+* 开发环境 IAR 9.40.1
+* 适用平台 CYT2BL3
+* 店铺链接 https://seekfree.taobao.com/
+*
+* 修改记录
+* 日期 作者 备注
+* 2024-11-19 pudding first version
+********************************************************************************************************************/
+/*********************************************************************************************************************
+* 接线定义:
+* ------------------------------------
+* 模块管脚 单片机管脚
+* // 硬件 SPI 引脚
+* CLK 查看 zf_device_menc15a.h 中 MENC15A_CLK_PIN 宏定义
+* MOSI 查看 zf_device_menc15a.h 中 MENC15A_MOSI_PIN 宏定义
+* MISO 查看 zf_device_menc15a.h 中 MENC15A_MISO_PIN 宏定义
+* CS 查看 zf_device_menc15a.h 中 MENC15A_CS_PIN 宏定义
+* VCC 3.3V电源
+* GND 电源地
+* 其余引脚悬空
+* ------------------------------------
+********************************************************************************************************************/
+
+
+#ifndef _zf_device_menc15a_h_
+#define _zf_device_menc15a_h_
+
+#include "zf_common_typedef.h"
+
+//================================================定义 MENC15A 基本配置================================================
+
+//====================================================硬件 SPI 驱动====================================================
+#define MENC15A_1_SPI_SPEED (20 * 1000 * 1000) // 磁编码器1 硬件 SPI 速率
+#define MENC15A_1_SPI (SPI_0 ) // 磁编码器1 硬件 SPI 号
+#define MENC15A_1_CLK_PIN (SPI0_SCLK_P20_11) // 磁编码器1 硬件 SPI SCK 引脚
+#define MENC15A_1_MOSI_PIN (SPI0_MOSI_P20_14) // 磁编码器1 硬件 SPI MOSI 引脚
+#define MENC15A_1_MISO_PIN (SPI0_MISO_P20_12) // 磁编码器1 硬件 SPI MISO 引脚
+#define MENC15A_1_CS_PIN (P20_13) // 磁编码器1 CS 片选引脚
+#define MENC15A_1_CS(x) ((x) ? (gpio_high(MENC15A_1_CS_PIN)) : (gpio_low(MENC15A_1_CS_PIN)))
+
+
+#define MENC15A_2_SPI_SPEED (20 * 1000 * 1000) // 磁编码器2 硬件 SPI 速率
+#define MENC15A_2_SPI (SPI_0 ) // 磁编码器2 硬件 SPI 号
+#define MENC15A_2_CLK_PIN (SPI0_SCLK_P20_11 ) // 磁编码器2 硬件 SPI SCK 引脚
+#define MENC15A_2_MOSI_PIN (SPI0_MOSI_P20_14 ) // 磁编码器2 硬件 SPI MOSI 引脚
+#define MENC15A_2_MISO_PIN (SPI0_MISO_P20_12 ) // 磁编码器2 硬件 SPI MISO 引脚
+#define MENC15A_2_CS_PIN (P20_15) // 磁编码器2 CS 片选引脚
+#define MENC15A_2_CS(x) ((x) ? (gpio_high(MENC15A_2_CS_PIN)) : (gpio_low(MENC15A_2_CS_PIN)))
+
+//====================================================硬件 SPI 驱动====================================================
+
+// 枚举磁编码模块
+typedef enum
+{
+ menc15a_1_module,
+ menc15a_2_module,
+
+}menc15a_module_enum;
+
+//================================================定义 MENC15A 基本配置================================================
+
+
+extern uint16 menc15a_absolute_data[2];
+
+extern int16 menc15a_absolute_offset_data[2];
+
+extern int16 menc15a_speed_data[2];
+
+
+uint16 menc15a_get_absolute_data(menc15a_module_enum menc15a_module);
+int16 menc15a_get_speed_data(menc15a_module_enum menc15a_module);
+
+uint8 menc15a_init(void);
+
+
+#endif
diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_uart_receiver.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_uart_receiver.c
index 3ebb3bd..ade446d 100644
--- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_uart_receiver.c
+++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_uart_receiver.c
@@ -91,7 +91,7 @@ static void uart_receiver_analysis (uart_receiver_struct *remote_data,uint8 * bu
remote_data->channel[num++] = (buffer[5] >> 1 | buffer[6] << 7 ) & 0x07FF;
remote_data->channel[num++] = (buffer[6] >> 4 | buffer[7] << 4 ) & 0x07FF;
remote_data->channel[num++] = (buffer[7] >> 7 | buffer[8] << 1 | buffer[9] << 9 ) & 0x07FF;
- remote_data->state = (SBUS_NORMAL_STATE == buffer[23]) ? 1 : 0;
+ remote_data->state = (SBUS_ABNORMAL_STATE == (buffer[23] & SBUS_ABNORMAL_STATE)) ? 0 : 1;
uart_receiver.finsh_flag = 1;
}
diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_uart_receiver.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_uart_receiver.h
index 948ab2f..6498dcb 100644
--- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_uart_receiver.h
+++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_uart_receiver.h
@@ -55,8 +55,7 @@
#define REV_DATA_LEN ( 25 ) // SBUS帧长
#define FRAME_STAR ( 0X0F ) // 帧头信息
#define FRAME_END ( 0X00 ) // 帧尾信息
-#define SBUS_NORMAL_STATE ( 0X03 ) // 正常状态
-#define SBUS_ABNORMAL_STATE ( 0X0F ) // 失控状态
+#define SBUS_ABNORMAL_STATE ( 0X04 ) // 失控状态
typedef struct
{
diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
index 1c96965..40d9e28 100644
--- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
+++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
@@ -88,6 +88,8 @@ zf_device_uart_receiver.h SUBS
zf_device_absolute_encoder.h 360° 位置传感器 绝对式迷你 mini 编码器 分辨率:0.088°
+zf_device_menc15a.h 15位高精度磁编码器驱动 位置式
+
zf_device_gnss.h GPS 及 RTK 定位模块 双频高精度定位模块 亚米级定位
zf_device_key.h GPIO 按键驱动 用于检测主板按键状态
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 f817dd9..d74841c 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
@@ -766,11 +766,11 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name
IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕 首次发送数据 此时接收缓冲区无数据
IfxQspi_writeTransmitFifo(moudle, (uint8)(register_name & 0x00FF)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 1); // 等待接收完毕 再次发送数据 此时接收缓冲区有1个数据
spi_clear_fifo(moudle); // 清除接收缓存区
@@ -818,11 +818,11 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name,
IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕 首次发送数据 此时接收缓冲区无数据
IfxQspi_writeTransmitFifo(moudle, (uint8)(register_name & 0x00FF)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 1); // 等待接收完毕 再次发送数据 此时接收缓冲区有1个数据
spi_clear_fifo(moudle); // 清除接收缓存区
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 f45bf81..4df6214 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,7 @@
+V3.3.2
+ 新增zf_device_menc15a磁编码器外设驱动
+ 更改uart接收机部分语句
+ 修正SPI的16位通讯错位问题
V3.3.1
移除正交编码器的断言检测
新增重命名工程工具
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 3a140e3..c8f75f2 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
@@ -93,6 +93,7 @@
#include "zf_device_ips114.h"
#include "zf_device_ips200.h"
#include "zf_device_key.h"
+#include "zf_device_menc15a.h"
#include "zf_device_mpu6050.h"
#include "zf_device_mt9v03x.h"
#include "zf_device_oled.h"
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 cc42e43..adfc4a3 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
@@ -91,8 +91,10 @@ ZF_WEAK void seekfree_assistant_interface_init (seekfree_assistant_transfer_devi
{
case SEEKFREE_ASSISTANT_DEBUG_UART:
{
+#if DEBUG_UART_USE_INTERRUPT == 1
seekfree_assistant_transfer_callback = debug_send_buffer;
seekfree_assistant_receive_callback = debug_read_ring_buffer;
+#endif
}break;
case SEEKFREE_ASSISTANT_WIRELESS_UART:
diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_menc15a.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_menc15a.c
new file mode 100644
index 0000000..faaeba2
--- /dev/null
+++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_menc15a.c
@@ -0,0 +1,188 @@
+/*********************************************************************************************************************
+* CYT2BL3 Opensourec Library 即( CYT2BL3 开源库)是一个基于官方 SDK 接口的第三方开源库
+* Copyright (c) 2022 SEEKFREE 逐飞科技
+*
+* 本文件是 CYT2BL3 开源库的一部分
+*
+* CYT2BL3 开源库 是免费软件
+* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
+* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
+*
+* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
+* 甚至没有隐含的适销性或适合特定用途的保证
+* 更多细节请参见 GPL
+*
+* 您应该在收到本开源库的同时收到一份 GPL 的副本
+* 如果没有,请参阅
+*
+* 额外注明:
+* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
+* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
+* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
+* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
+*
+* 文件名称 zf_device_menc15a
+* 公司名称 成都逐飞科技有限公司
+* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
+* 开发环境 IAR 9.40.1
+* 适用平台 CYT2BL3
+* 店铺链接 https://seekfree.taobao.com/
+*
+* 修改记录
+* 日期 作者 备注
+* 2024-11-19 pudding first version
+********************************************************************************************************************/
+/*********************************************************************************************************************
+* 接线定义:
+* ------------------------------------
+* 模块管脚 单片机管脚
+* // 硬件 SPI 引脚
+* SCL/SPC 查看 zf_device_menc15a.h 中 MENC15A_SPC_PIN 宏定义
+* SDA/DSI 查看 zf_device_menc15a.h 中 MENC15A_SDI_PIN 宏定义
+* SA0/SDO 查看 zf_device_menc15a.h 中 MENC15A_SDO_PIN 宏定义
+* CS 查看 zf_device_menc15a.h 中 MENC15A_CS_PIN 宏定义
+* VCC 3.3V电源
+* GND 电源地
+* 其余引脚悬空
+* ------------------------------------
+********************************************************************************************************************/
+
+#include "zf_common_debug.h"
+#include "zf_common_function.h"
+#include "zf_device_config.h"
+#include "zf_driver_delay.h"
+#include "zf_driver_gpio.h"
+#include "zf_driver_spi.h"
+
+#include "zf_device_menc15a.h"
+
+uint16 menc15a_absolute_data[2] = {0};
+
+int16 menc15a_absolute_offset_data[2] = {0};
+
+int16 menc15a_speed_data[2] = {0};
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 计算编码器旋转偏差
+// 参数说明 encoder_max 编码器精度 填写十进制数据
+// 参数说明 now_location 当前位置信息
+// 参数说明 last_location 上一次的位置信息
+// 返回参数 int32 计算的偏差值
+// 使用示例 magnetic_encoder_get_offset();
+// 备注信息
+//-------------------------------------------------------------------------------------------------------------------
+static int32 magnetic_encoder_get_offset (int32 encoder_max, int32 now_location, int32 last_location)
+{
+ int32 result_data = 0;
+
+ if((encoder_max / 2) < func_abs(now_location - last_location))
+ {
+ result_data = ((encoder_max / 2) < now_location ? (now_location - encoder_max - last_location) : (now_location + encoder_max - last_location));
+ }
+ else
+ {
+ result_data = (now_location - last_location);
+ }
+
+ return result_data;
+}
+
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 获取 MENC15A 磁编码器 的 绝对值 角度数据
+// 参数说明 menc15a_module 磁编码器 模块号
+// 返回参数 uint16 绝对值 角度数据
+// 使用示例 menc15a_1_get_absolute_data();
+// 备注信息 执行该函数后,可直接使用返回值 也可以通过查询对应变量获取结果
+//-------------------------------------------------------------------------------------------------------------------
+uint16 menc15a_get_absolute_data(menc15a_module_enum menc15a_module)
+{
+ uint16 read_data = 0;
+
+ uint16 data_last = menc15a_absolute_data[menc15a_module];
+
+ if(menc15a_module == menc15a_1_module)
+ {
+ MENC15A_1_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_1_SPI, 0x8021);
+
+ MENC15A_1_CS(1);
+ }
+ else
+ {
+ MENC15A_2_CS(0);
+
+ spi_write_8bit(MENC15A_2_SPI, 0x80);
+ spi_write_8bit(MENC15A_2_SPI, 0x21);
+ read_data = spi_read_8bit(MENC15A_2_SPI);
+ read_data = ((read_data << 8) | spi_read_8bit(MENC15A_2_SPI));
+
+ MENC15A_2_CS(1);
+ }
+
+ menc15a_absolute_data[menc15a_module] = (read_data & 0x7fff);
+
+ menc15a_absolute_offset_data[menc15a_module] = (int16)magnetic_encoder_get_offset(32768, menc15a_absolute_data[menc15a_module], data_last);
+
+ return menc15a_absolute_data[menc15a_module];
+}
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 获取 MENC15A 磁编码器 的 转速数据
+// 参数说明 menc15a_module 磁编码器 模块号
+// 返回参数 int16 转速数据(每秒旋转弧度 rad/s)
+// 使用示例 menc15a_1_get_speed_data();
+// 备注信息 执行该函数后,可直接使用返回值 也可以通过查询对应变量获取结果
+//-------------------------------------------------------------------------------------------------------------------
+int16 menc15a_get_speed_data(menc15a_module_enum menc15a_module)
+{
+ int16 read_data = 0;
+
+ if(menc15a_module == menc15a_1_module)
+ {
+ MENC15A_1_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_1_SPI, 0x8032);
+
+ MENC15A_1_CS(1);
+ }
+ else
+ {
+ MENC15A_2_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_2_SPI, 0x8032);
+
+ MENC15A_2_CS(1);
+ }
+
+ read_data = (read_data & 0x7fff);
+
+ if(read_data > 16384)
+ {
+ read_data = read_data - 32768;
+ }
+
+ menc15a_speed_data[menc15a_module] = (int16)((float)read_data * 1.917476f);
+
+ return menc15a_speed_data[menc15a_module];
+}
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 初始化 MENC15A
+// 参数说明 void
+// 返回参数 uint8 1-初始化失败 0-初始化成功
+// 使用示例 menc15a_init();
+// 备注信息
+//-------------------------------------------------------------------------------------------------------------------
+uint8 menc15a_init(void)
+{
+ spi_init(MENC15A_1_SPI, SPI_MODE1, MENC15A_1_SPI_SPEED, MENC15A_1_CLK_PIN, MENC15A_1_MOSI_PIN, MENC15A_1_MISO_PIN, SPI_CS_NULL); // 配置 MENC15A-1 的 SPI端口
+ gpio_init(MENC15A_1_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); // 配置 MENC15A-1 的 CS端口
+
+ spi_init(MENC15A_2_SPI, SPI_MODE1, MENC15A_2_SPI_SPEED, MENC15A_2_CLK_PIN, MENC15A_2_MOSI_PIN, MENC15A_2_MISO_PIN, SPI_CS_NULL); // 配置 MENC15A-2 的 SPI端口
+ gpio_init(MENC15A_2_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); // 配置 MENC15A-2 的 CS端口
+
+ return 0;
+}
+
diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_menc15a.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_menc15a.h
new file mode 100644
index 0000000..068d877
--- /dev/null
+++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_menc15a.h
@@ -0,0 +1,102 @@
+/*********************************************************************************************************************
+* CYT2BL3 Opensourec Library 即( CYT2BL3 开源库)是一个基于官方 SDK 接口的第三方开源库
+* Copyright (c) 2022 SEEKFREE 逐飞科技
+*
+* 本文件是 CYT2BL3 开源库的一部分
+*
+* CYT2BL3 开源库 是免费软件
+* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
+* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
+*
+* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
+* 甚至没有隐含的适销性或适合特定用途的保证
+* 更多细节请参见 GPL
+*
+* 您应该在收到本开源库的同时收到一份 GPL 的副本
+* 如果没有,请参阅
+*
+* 额外注明:
+* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
+* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
+* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
+* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
+*
+* 文件名称 zf_device_menc15a
+* 公司名称 成都逐飞科技有限公司
+* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
+* 开发环境 IAR 9.40.1
+* 适用平台 CYT2BL3
+* 店铺链接 https://seekfree.taobao.com/
+*
+* 修改记录
+* 日期 作者 备注
+* 2024-11-19 pudding first version
+********************************************************************************************************************/
+/*********************************************************************************************************************
+* 接线定义:
+* ------------------------------------
+* 模块管脚 单片机管脚
+* // 硬件 SPI 引脚
+* CLK 查看 zf_device_menc15a.h 中 MENC15A_CLK_PIN 宏定义
+* MOSI 查看 zf_device_menc15a.h 中 MENC15A_MOSI_PIN 宏定义
+* MISO 查看 zf_device_menc15a.h 中 MENC15A_MISO_PIN 宏定义
+* CS 查看 zf_device_menc15a.h 中 MENC15A_CS_PIN 宏定义
+* VCC 3.3V电源
+* GND 电源地
+* 其余引脚悬空
+* ------------------------------------
+********************************************************************************************************************/
+
+
+#ifndef _zf_device_menc15a_h_
+#define _zf_device_menc15a_h_
+
+#include "zf_common_typedef.h"
+
+//================================================定义 MENC15A 基本配置================================================
+
+//====================================================硬件 SPI 驱动====================================================
+#define MENC15A_1_SPI_SPEED (20 * 1000 * 1000) // 磁编码器1 硬件 SPI 速率
+#define MENC15A_1_SPI (SPI_0 ) // 磁编码器1 硬件 SPI 号
+#define MENC15A_1_CLK_PIN (SPI0_SCLK_P20_11) // 磁编码器1 硬件 SPI SCK 引脚
+#define MENC15A_1_MOSI_PIN (SPI0_MOSI_P20_14) // 磁编码器1 硬件 SPI MOSI 引脚
+#define MENC15A_1_MISO_PIN (SPI0_MISO_P20_12) // 磁编码器1 硬件 SPI MISO 引脚
+#define MENC15A_1_CS_PIN (P20_13) // 磁编码器1 CS 片选引脚
+#define MENC15A_1_CS(x) ((x) ? (gpio_high(MENC15A_1_CS_PIN)) : (gpio_low(MENC15A_1_CS_PIN)))
+
+
+#define MENC15A_2_SPI_SPEED (20 * 1000 * 1000) // 磁编码器2 硬件 SPI 速率
+#define MENC15A_2_SPI (SPI_0 ) // 磁编码器2 硬件 SPI 号
+#define MENC15A_2_CLK_PIN (SPI0_SCLK_P20_11 ) // 磁编码器2 硬件 SPI SCK 引脚
+#define MENC15A_2_MOSI_PIN (SPI0_MOSI_P20_14 ) // 磁编码器2 硬件 SPI MOSI 引脚
+#define MENC15A_2_MISO_PIN (SPI0_MISO_P20_12 ) // 磁编码器2 硬件 SPI MISO 引脚
+#define MENC15A_2_CS_PIN (P20_15) // 磁编码器2 CS 片选引脚
+#define MENC15A_2_CS(x) ((x) ? (gpio_high(MENC15A_2_CS_PIN)) : (gpio_low(MENC15A_2_CS_PIN)))
+
+//====================================================硬件 SPI 驱动====================================================
+
+// 枚举磁编码模块
+typedef enum
+{
+ menc15a_1_module,
+ menc15a_2_module,
+
+}menc15a_module_enum;
+
+//================================================定义 MENC15A 基本配置================================================
+
+
+extern uint16 menc15a_absolute_data[2];
+
+extern int16 menc15a_absolute_offset_data[2];
+
+extern int16 menc15a_speed_data[2];
+
+
+uint16 menc15a_get_absolute_data(menc15a_module_enum menc15a_module);
+int16 menc15a_get_speed_data(menc15a_module_enum menc15a_module);
+
+uint8 menc15a_init(void);
+
+
+#endif
diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_uart_receiver.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_uart_receiver.c
index 3ebb3bd..ade446d 100644
--- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_uart_receiver.c
+++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_uart_receiver.c
@@ -91,7 +91,7 @@ static void uart_receiver_analysis (uart_receiver_struct *remote_data,uint8 * bu
remote_data->channel[num++] = (buffer[5] >> 1 | buffer[6] << 7 ) & 0x07FF;
remote_data->channel[num++] = (buffer[6] >> 4 | buffer[7] << 4 ) & 0x07FF;
remote_data->channel[num++] = (buffer[7] >> 7 | buffer[8] << 1 | buffer[9] << 9 ) & 0x07FF;
- remote_data->state = (SBUS_NORMAL_STATE == buffer[23]) ? 1 : 0;
+ remote_data->state = (SBUS_ABNORMAL_STATE == (buffer[23] & SBUS_ABNORMAL_STATE)) ? 0 : 1;
uart_receiver.finsh_flag = 1;
}
diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_uart_receiver.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_uart_receiver.h
index 948ab2f..6498dcb 100644
--- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_uart_receiver.h
+++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_uart_receiver.h
@@ -55,8 +55,7 @@
#define REV_DATA_LEN ( 25 ) // SBUS帧长
#define FRAME_STAR ( 0X0F ) // 帧头信息
#define FRAME_END ( 0X00 ) // 帧尾信息
-#define SBUS_NORMAL_STATE ( 0X03 ) // 正常状态
-#define SBUS_ABNORMAL_STATE ( 0X0F ) // 失控状态
+#define SBUS_ABNORMAL_STATE ( 0X04 ) // 失控状态
typedef struct
{
diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
index 1c96965..40d9e28 100644
--- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
+++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
@@ -88,6 +88,8 @@ zf_device_uart_receiver.h SUBS
zf_device_absolute_encoder.h 360° 位置传感器 绝对式迷你 mini 编码器 分辨率:0.088°
+zf_device_menc15a.h 15位高精度磁编码器驱动 位置式
+
zf_device_gnss.h GPS 及 RTK 定位模块 双频高精度定位模块 亚米级定位
zf_device_key.h GPIO 按键驱动 用于检测主板按键状态
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 f817dd9..d74841c 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
@@ -766,11 +766,11 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name
IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕 首次发送数据 此时接收缓冲区无数据
IfxQspi_writeTransmitFifo(moudle, (uint8)(register_name & 0x00FF)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 1); // 等待接收完毕 再次发送数据 此时接收缓冲区有1个数据
spi_clear_fifo(moudle); // 清除接收缓存区
@@ -818,11 +818,11 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name,
IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕 首次发送数据 此时接收缓冲区无数据
IfxQspi_writeTransmitFifo(moudle, (uint8)(register_name & 0x00FF)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 1); // 等待接收完毕 再次发送数据 此时接收缓冲区有1个数据
spi_clear_fifo(moudle); // 清除接收缓存区
diff --git a/Example/E13_dual_core_demo/libraries/doc/version.txt b/Example/E13_dual_core_demo/libraries/doc/version.txt
index f45bf81..4df6214 100644
--- a/Example/E13_dual_core_demo/libraries/doc/version.txt
+++ b/Example/E13_dual_core_demo/libraries/doc/version.txt
@@ -1,3 +1,7 @@
+V3.3.2
+ 新增zf_device_menc15a磁编码器外设驱动
+ 更改uart接收机部分语句
+ 修正SPI的16位通讯错位问题
V3.3.1
移除正交编码器的断言检测
新增重命名工程工具
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 3a140e3..c8f75f2 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
@@ -93,6 +93,7 @@
#include "zf_device_ips114.h"
#include "zf_device_ips200.h"
#include "zf_device_key.h"
+#include "zf_device_menc15a.h"
#include "zf_device_mpu6050.h"
#include "zf_device_mt9v03x.h"
#include "zf_device_oled.h"
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 cc42e43..adfc4a3 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
@@ -91,8 +91,10 @@ ZF_WEAK void seekfree_assistant_interface_init (seekfree_assistant_transfer_devi
{
case SEEKFREE_ASSISTANT_DEBUG_UART:
{
+#if DEBUG_UART_USE_INTERRUPT == 1
seekfree_assistant_transfer_callback = debug_send_buffer;
seekfree_assistant_receive_callback = debug_read_ring_buffer;
+#endif
}break;
case SEEKFREE_ASSISTANT_WIRELESS_UART:
diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_menc15a.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_menc15a.c
new file mode 100644
index 0000000..faaeba2
--- /dev/null
+++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_menc15a.c
@@ -0,0 +1,188 @@
+/*********************************************************************************************************************
+* CYT2BL3 Opensourec Library 即( CYT2BL3 开源库)是一个基于官方 SDK 接口的第三方开源库
+* Copyright (c) 2022 SEEKFREE 逐飞科技
+*
+* 本文件是 CYT2BL3 开源库的一部分
+*
+* CYT2BL3 开源库 是免费软件
+* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
+* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
+*
+* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
+* 甚至没有隐含的适销性或适合特定用途的保证
+* 更多细节请参见 GPL
+*
+* 您应该在收到本开源库的同时收到一份 GPL 的副本
+* 如果没有,请参阅
+*
+* 额外注明:
+* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
+* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
+* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
+* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
+*
+* 文件名称 zf_device_menc15a
+* 公司名称 成都逐飞科技有限公司
+* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
+* 开发环境 IAR 9.40.1
+* 适用平台 CYT2BL3
+* 店铺链接 https://seekfree.taobao.com/
+*
+* 修改记录
+* 日期 作者 备注
+* 2024-11-19 pudding first version
+********************************************************************************************************************/
+/*********************************************************************************************************************
+* 接线定义:
+* ------------------------------------
+* 模块管脚 单片机管脚
+* // 硬件 SPI 引脚
+* SCL/SPC 查看 zf_device_menc15a.h 中 MENC15A_SPC_PIN 宏定义
+* SDA/DSI 查看 zf_device_menc15a.h 中 MENC15A_SDI_PIN 宏定义
+* SA0/SDO 查看 zf_device_menc15a.h 中 MENC15A_SDO_PIN 宏定义
+* CS 查看 zf_device_menc15a.h 中 MENC15A_CS_PIN 宏定义
+* VCC 3.3V电源
+* GND 电源地
+* 其余引脚悬空
+* ------------------------------------
+********************************************************************************************************************/
+
+#include "zf_common_debug.h"
+#include "zf_common_function.h"
+#include "zf_device_config.h"
+#include "zf_driver_delay.h"
+#include "zf_driver_gpio.h"
+#include "zf_driver_spi.h"
+
+#include "zf_device_menc15a.h"
+
+uint16 menc15a_absolute_data[2] = {0};
+
+int16 menc15a_absolute_offset_data[2] = {0};
+
+int16 menc15a_speed_data[2] = {0};
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 计算编码器旋转偏差
+// 参数说明 encoder_max 编码器精度 填写十进制数据
+// 参数说明 now_location 当前位置信息
+// 参数说明 last_location 上一次的位置信息
+// 返回参数 int32 计算的偏差值
+// 使用示例 magnetic_encoder_get_offset();
+// 备注信息
+//-------------------------------------------------------------------------------------------------------------------
+static int32 magnetic_encoder_get_offset (int32 encoder_max, int32 now_location, int32 last_location)
+{
+ int32 result_data = 0;
+
+ if((encoder_max / 2) < func_abs(now_location - last_location))
+ {
+ result_data = ((encoder_max / 2) < now_location ? (now_location - encoder_max - last_location) : (now_location + encoder_max - last_location));
+ }
+ else
+ {
+ result_data = (now_location - last_location);
+ }
+
+ return result_data;
+}
+
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 获取 MENC15A 磁编码器 的 绝对值 角度数据
+// 参数说明 menc15a_module 磁编码器 模块号
+// 返回参数 uint16 绝对值 角度数据
+// 使用示例 menc15a_1_get_absolute_data();
+// 备注信息 执行该函数后,可直接使用返回值 也可以通过查询对应变量获取结果
+//-------------------------------------------------------------------------------------------------------------------
+uint16 menc15a_get_absolute_data(menc15a_module_enum menc15a_module)
+{
+ uint16 read_data = 0;
+
+ uint16 data_last = menc15a_absolute_data[menc15a_module];
+
+ if(menc15a_module == menc15a_1_module)
+ {
+ MENC15A_1_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_1_SPI, 0x8021);
+
+ MENC15A_1_CS(1);
+ }
+ else
+ {
+ MENC15A_2_CS(0);
+
+ spi_write_8bit(MENC15A_2_SPI, 0x80);
+ spi_write_8bit(MENC15A_2_SPI, 0x21);
+ read_data = spi_read_8bit(MENC15A_2_SPI);
+ read_data = ((read_data << 8) | spi_read_8bit(MENC15A_2_SPI));
+
+ MENC15A_2_CS(1);
+ }
+
+ menc15a_absolute_data[menc15a_module] = (read_data & 0x7fff);
+
+ menc15a_absolute_offset_data[menc15a_module] = (int16)magnetic_encoder_get_offset(32768, menc15a_absolute_data[menc15a_module], data_last);
+
+ return menc15a_absolute_data[menc15a_module];
+}
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 获取 MENC15A 磁编码器 的 转速数据
+// 参数说明 menc15a_module 磁编码器 模块号
+// 返回参数 int16 转速数据(每秒旋转弧度 rad/s)
+// 使用示例 menc15a_1_get_speed_data();
+// 备注信息 执行该函数后,可直接使用返回值 也可以通过查询对应变量获取结果
+//-------------------------------------------------------------------------------------------------------------------
+int16 menc15a_get_speed_data(menc15a_module_enum menc15a_module)
+{
+ int16 read_data = 0;
+
+ if(menc15a_module == menc15a_1_module)
+ {
+ MENC15A_1_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_1_SPI, 0x8032);
+
+ MENC15A_1_CS(1);
+ }
+ else
+ {
+ MENC15A_2_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_2_SPI, 0x8032);
+
+ MENC15A_2_CS(1);
+ }
+
+ read_data = (read_data & 0x7fff);
+
+ if(read_data > 16384)
+ {
+ read_data = read_data - 32768;
+ }
+
+ menc15a_speed_data[menc15a_module] = (int16)((float)read_data * 1.917476f);
+
+ return menc15a_speed_data[menc15a_module];
+}
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 初始化 MENC15A
+// 参数说明 void
+// 返回参数 uint8 1-初始化失败 0-初始化成功
+// 使用示例 menc15a_init();
+// 备注信息
+//-------------------------------------------------------------------------------------------------------------------
+uint8 menc15a_init(void)
+{
+ spi_init(MENC15A_1_SPI, SPI_MODE1, MENC15A_1_SPI_SPEED, MENC15A_1_CLK_PIN, MENC15A_1_MOSI_PIN, MENC15A_1_MISO_PIN, SPI_CS_NULL); // 配置 MENC15A-1 的 SPI端口
+ gpio_init(MENC15A_1_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); // 配置 MENC15A-1 的 CS端口
+
+ spi_init(MENC15A_2_SPI, SPI_MODE1, MENC15A_2_SPI_SPEED, MENC15A_2_CLK_PIN, MENC15A_2_MOSI_PIN, MENC15A_2_MISO_PIN, SPI_CS_NULL); // 配置 MENC15A-2 的 SPI端口
+ gpio_init(MENC15A_2_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); // 配置 MENC15A-2 的 CS端口
+
+ return 0;
+}
+
diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_menc15a.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_menc15a.h
new file mode 100644
index 0000000..068d877
--- /dev/null
+++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_menc15a.h
@@ -0,0 +1,102 @@
+/*********************************************************************************************************************
+* CYT2BL3 Opensourec Library 即( CYT2BL3 开源库)是一个基于官方 SDK 接口的第三方开源库
+* Copyright (c) 2022 SEEKFREE 逐飞科技
+*
+* 本文件是 CYT2BL3 开源库的一部分
+*
+* CYT2BL3 开源库 是免费软件
+* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
+* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
+*
+* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
+* 甚至没有隐含的适销性或适合特定用途的保证
+* 更多细节请参见 GPL
+*
+* 您应该在收到本开源库的同时收到一份 GPL 的副本
+* 如果没有,请参阅
+*
+* 额外注明:
+* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
+* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
+* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
+* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
+*
+* 文件名称 zf_device_menc15a
+* 公司名称 成都逐飞科技有限公司
+* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
+* 开发环境 IAR 9.40.1
+* 适用平台 CYT2BL3
+* 店铺链接 https://seekfree.taobao.com/
+*
+* 修改记录
+* 日期 作者 备注
+* 2024-11-19 pudding first version
+********************************************************************************************************************/
+/*********************************************************************************************************************
+* 接线定义:
+* ------------------------------------
+* 模块管脚 单片机管脚
+* // 硬件 SPI 引脚
+* CLK 查看 zf_device_menc15a.h 中 MENC15A_CLK_PIN 宏定义
+* MOSI 查看 zf_device_menc15a.h 中 MENC15A_MOSI_PIN 宏定义
+* MISO 查看 zf_device_menc15a.h 中 MENC15A_MISO_PIN 宏定义
+* CS 查看 zf_device_menc15a.h 中 MENC15A_CS_PIN 宏定义
+* VCC 3.3V电源
+* GND 电源地
+* 其余引脚悬空
+* ------------------------------------
+********************************************************************************************************************/
+
+
+#ifndef _zf_device_menc15a_h_
+#define _zf_device_menc15a_h_
+
+#include "zf_common_typedef.h"
+
+//================================================定义 MENC15A 基本配置================================================
+
+//====================================================硬件 SPI 驱动====================================================
+#define MENC15A_1_SPI_SPEED (20 * 1000 * 1000) // 磁编码器1 硬件 SPI 速率
+#define MENC15A_1_SPI (SPI_0 ) // 磁编码器1 硬件 SPI 号
+#define MENC15A_1_CLK_PIN (SPI0_SCLK_P20_11) // 磁编码器1 硬件 SPI SCK 引脚
+#define MENC15A_1_MOSI_PIN (SPI0_MOSI_P20_14) // 磁编码器1 硬件 SPI MOSI 引脚
+#define MENC15A_1_MISO_PIN (SPI0_MISO_P20_12) // 磁编码器1 硬件 SPI MISO 引脚
+#define MENC15A_1_CS_PIN (P20_13) // 磁编码器1 CS 片选引脚
+#define MENC15A_1_CS(x) ((x) ? (gpio_high(MENC15A_1_CS_PIN)) : (gpio_low(MENC15A_1_CS_PIN)))
+
+
+#define MENC15A_2_SPI_SPEED (20 * 1000 * 1000) // 磁编码器2 硬件 SPI 速率
+#define MENC15A_2_SPI (SPI_0 ) // 磁编码器2 硬件 SPI 号
+#define MENC15A_2_CLK_PIN (SPI0_SCLK_P20_11 ) // 磁编码器2 硬件 SPI SCK 引脚
+#define MENC15A_2_MOSI_PIN (SPI0_MOSI_P20_14 ) // 磁编码器2 硬件 SPI MOSI 引脚
+#define MENC15A_2_MISO_PIN (SPI0_MISO_P20_12 ) // 磁编码器2 硬件 SPI MISO 引脚
+#define MENC15A_2_CS_PIN (P20_15) // 磁编码器2 CS 片选引脚
+#define MENC15A_2_CS(x) ((x) ? (gpio_high(MENC15A_2_CS_PIN)) : (gpio_low(MENC15A_2_CS_PIN)))
+
+//====================================================硬件 SPI 驱动====================================================
+
+// 枚举磁编码模块
+typedef enum
+{
+ menc15a_1_module,
+ menc15a_2_module,
+
+}menc15a_module_enum;
+
+//================================================定义 MENC15A 基本配置================================================
+
+
+extern uint16 menc15a_absolute_data[2];
+
+extern int16 menc15a_absolute_offset_data[2];
+
+extern int16 menc15a_speed_data[2];
+
+
+uint16 menc15a_get_absolute_data(menc15a_module_enum menc15a_module);
+int16 menc15a_get_speed_data(menc15a_module_enum menc15a_module);
+
+uint8 menc15a_init(void);
+
+
+#endif
diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_uart_receiver.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_uart_receiver.c
index 3ebb3bd..ade446d 100644
--- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_uart_receiver.c
+++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_uart_receiver.c
@@ -91,7 +91,7 @@ static void uart_receiver_analysis (uart_receiver_struct *remote_data,uint8 * bu
remote_data->channel[num++] = (buffer[5] >> 1 | buffer[6] << 7 ) & 0x07FF;
remote_data->channel[num++] = (buffer[6] >> 4 | buffer[7] << 4 ) & 0x07FF;
remote_data->channel[num++] = (buffer[7] >> 7 | buffer[8] << 1 | buffer[9] << 9 ) & 0x07FF;
- remote_data->state = (SBUS_NORMAL_STATE == buffer[23]) ? 1 : 0;
+ remote_data->state = (SBUS_ABNORMAL_STATE == (buffer[23] & SBUS_ABNORMAL_STATE)) ? 0 : 1;
uart_receiver.finsh_flag = 1;
}
diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_uart_receiver.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_uart_receiver.h
index 948ab2f..6498dcb 100644
--- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_uart_receiver.h
+++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_uart_receiver.h
@@ -55,8 +55,7 @@
#define REV_DATA_LEN ( 25 ) // SBUS帧长
#define FRAME_STAR ( 0X0F ) // 帧头信息
#define FRAME_END ( 0X00 ) // 帧尾信息
-#define SBUS_NORMAL_STATE ( 0X03 ) // 正常状态
-#define SBUS_ABNORMAL_STATE ( 0X0F ) // 失控状态
+#define SBUS_ABNORMAL_STATE ( 0X04 ) // 失控状态
typedef struct
{
diff --git a/Example/E13_dual_core_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt b/Example/E13_dual_core_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
index 1c96965..40d9e28 100644
--- a/Example/E13_dual_core_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
+++ b/Example/E13_dual_core_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
@@ -88,6 +88,8 @@ zf_device_uart_receiver.h SUBS
zf_device_absolute_encoder.h 360° 位置传感器 绝对式迷你 mini 编码器 分辨率:0.088°
+zf_device_menc15a.h 15位高精度磁编码器驱动 位置式
+
zf_device_gnss.h GPS 及 RTK 定位模块 双频高精度定位模块 亚米级定位
zf_device_key.h GPIO 按键驱动 用于检测主板按键状态
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 f817dd9..d74841c 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
@@ -766,11 +766,11 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name
IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕 首次发送数据 此时接收缓冲区无数据
IfxQspi_writeTransmitFifo(moudle, (uint8)(register_name & 0x00FF)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 1); // 等待接收完毕 再次发送数据 此时接收缓冲区有1个数据
spi_clear_fifo(moudle); // 清除接收缓存区
@@ -818,11 +818,11 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name,
IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕 首次发送数据 此时接收缓冲区无数据
IfxQspi_writeTransmitFifo(moudle, (uint8)(register_name & 0x00FF)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 1); // 等待接收完毕 再次发送数据 此时接收缓冲区有1个数据
spi_clear_fifo(moudle); // 清除接收缓存区
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 f45bf81..4df6214 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,7 @@
+V3.3.2
+ 新增zf_device_menc15a磁编码器外设驱动
+ 更改uart接收机部分语句
+ 修正SPI的16位通讯错位问题
V3.3.1
移除正交编码器的断言检测
新增重命名工程工具
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 3a140e3..c8f75f2 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
@@ -93,6 +93,7 @@
#include "zf_device_ips114.h"
#include "zf_device_ips200.h"
#include "zf_device_key.h"
+#include "zf_device_menc15a.h"
#include "zf_device_mpu6050.h"
#include "zf_device_mt9v03x.h"
#include "zf_device_oled.h"
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 cc42e43..adfc4a3 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
@@ -91,8 +91,10 @@ ZF_WEAK void seekfree_assistant_interface_init (seekfree_assistant_transfer_devi
{
case SEEKFREE_ASSISTANT_DEBUG_UART:
{
+#if DEBUG_UART_USE_INTERRUPT == 1
seekfree_assistant_transfer_callback = debug_send_buffer;
seekfree_assistant_receive_callback = debug_read_ring_buffer;
+#endif
}break;
case SEEKFREE_ASSISTANT_WIRELESS_UART:
diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_menc15a.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_menc15a.c
new file mode 100644
index 0000000..faaeba2
--- /dev/null
+++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_menc15a.c
@@ -0,0 +1,188 @@
+/*********************************************************************************************************************
+* CYT2BL3 Opensourec Library 即( CYT2BL3 开源库)是一个基于官方 SDK 接口的第三方开源库
+* Copyright (c) 2022 SEEKFREE 逐飞科技
+*
+* 本文件是 CYT2BL3 开源库的一部分
+*
+* CYT2BL3 开源库 是免费软件
+* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
+* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
+*
+* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
+* 甚至没有隐含的适销性或适合特定用途的保证
+* 更多细节请参见 GPL
+*
+* 您应该在收到本开源库的同时收到一份 GPL 的副本
+* 如果没有,请参阅
+*
+* 额外注明:
+* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
+* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
+* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
+* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
+*
+* 文件名称 zf_device_menc15a
+* 公司名称 成都逐飞科技有限公司
+* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
+* 开发环境 IAR 9.40.1
+* 适用平台 CYT2BL3
+* 店铺链接 https://seekfree.taobao.com/
+*
+* 修改记录
+* 日期 作者 备注
+* 2024-11-19 pudding first version
+********************************************************************************************************************/
+/*********************************************************************************************************************
+* 接线定义:
+* ------------------------------------
+* 模块管脚 单片机管脚
+* // 硬件 SPI 引脚
+* SCL/SPC 查看 zf_device_menc15a.h 中 MENC15A_SPC_PIN 宏定义
+* SDA/DSI 查看 zf_device_menc15a.h 中 MENC15A_SDI_PIN 宏定义
+* SA0/SDO 查看 zf_device_menc15a.h 中 MENC15A_SDO_PIN 宏定义
+* CS 查看 zf_device_menc15a.h 中 MENC15A_CS_PIN 宏定义
+* VCC 3.3V电源
+* GND 电源地
+* 其余引脚悬空
+* ------------------------------------
+********************************************************************************************************************/
+
+#include "zf_common_debug.h"
+#include "zf_common_function.h"
+#include "zf_device_config.h"
+#include "zf_driver_delay.h"
+#include "zf_driver_gpio.h"
+#include "zf_driver_spi.h"
+
+#include "zf_device_menc15a.h"
+
+uint16 menc15a_absolute_data[2] = {0};
+
+int16 menc15a_absolute_offset_data[2] = {0};
+
+int16 menc15a_speed_data[2] = {0};
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 计算编码器旋转偏差
+// 参数说明 encoder_max 编码器精度 填写十进制数据
+// 参数说明 now_location 当前位置信息
+// 参数说明 last_location 上一次的位置信息
+// 返回参数 int32 计算的偏差值
+// 使用示例 magnetic_encoder_get_offset();
+// 备注信息
+//-------------------------------------------------------------------------------------------------------------------
+static int32 magnetic_encoder_get_offset (int32 encoder_max, int32 now_location, int32 last_location)
+{
+ int32 result_data = 0;
+
+ if((encoder_max / 2) < func_abs(now_location - last_location))
+ {
+ result_data = ((encoder_max / 2) < now_location ? (now_location - encoder_max - last_location) : (now_location + encoder_max - last_location));
+ }
+ else
+ {
+ result_data = (now_location - last_location);
+ }
+
+ return result_data;
+}
+
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 获取 MENC15A 磁编码器 的 绝对值 角度数据
+// 参数说明 menc15a_module 磁编码器 模块号
+// 返回参数 uint16 绝对值 角度数据
+// 使用示例 menc15a_1_get_absolute_data();
+// 备注信息 执行该函数后,可直接使用返回值 也可以通过查询对应变量获取结果
+//-------------------------------------------------------------------------------------------------------------------
+uint16 menc15a_get_absolute_data(menc15a_module_enum menc15a_module)
+{
+ uint16 read_data = 0;
+
+ uint16 data_last = menc15a_absolute_data[menc15a_module];
+
+ if(menc15a_module == menc15a_1_module)
+ {
+ MENC15A_1_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_1_SPI, 0x8021);
+
+ MENC15A_1_CS(1);
+ }
+ else
+ {
+ MENC15A_2_CS(0);
+
+ spi_write_8bit(MENC15A_2_SPI, 0x80);
+ spi_write_8bit(MENC15A_2_SPI, 0x21);
+ read_data = spi_read_8bit(MENC15A_2_SPI);
+ read_data = ((read_data << 8) | spi_read_8bit(MENC15A_2_SPI));
+
+ MENC15A_2_CS(1);
+ }
+
+ menc15a_absolute_data[menc15a_module] = (read_data & 0x7fff);
+
+ menc15a_absolute_offset_data[menc15a_module] = (int16)magnetic_encoder_get_offset(32768, menc15a_absolute_data[menc15a_module], data_last);
+
+ return menc15a_absolute_data[menc15a_module];
+}
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 获取 MENC15A 磁编码器 的 转速数据
+// 参数说明 menc15a_module 磁编码器 模块号
+// 返回参数 int16 转速数据(每秒旋转弧度 rad/s)
+// 使用示例 menc15a_1_get_speed_data();
+// 备注信息 执行该函数后,可直接使用返回值 也可以通过查询对应变量获取结果
+//-------------------------------------------------------------------------------------------------------------------
+int16 menc15a_get_speed_data(menc15a_module_enum menc15a_module)
+{
+ int16 read_data = 0;
+
+ if(menc15a_module == menc15a_1_module)
+ {
+ MENC15A_1_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_1_SPI, 0x8032);
+
+ MENC15A_1_CS(1);
+ }
+ else
+ {
+ MENC15A_2_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_2_SPI, 0x8032);
+
+ MENC15A_2_CS(1);
+ }
+
+ read_data = (read_data & 0x7fff);
+
+ if(read_data > 16384)
+ {
+ read_data = read_data - 32768;
+ }
+
+ menc15a_speed_data[menc15a_module] = (int16)((float)read_data * 1.917476f);
+
+ return menc15a_speed_data[menc15a_module];
+}
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 初始化 MENC15A
+// 参数说明 void
+// 返回参数 uint8 1-初始化失败 0-初始化成功
+// 使用示例 menc15a_init();
+// 备注信息
+//-------------------------------------------------------------------------------------------------------------------
+uint8 menc15a_init(void)
+{
+ spi_init(MENC15A_1_SPI, SPI_MODE1, MENC15A_1_SPI_SPEED, MENC15A_1_CLK_PIN, MENC15A_1_MOSI_PIN, MENC15A_1_MISO_PIN, SPI_CS_NULL); // 配置 MENC15A-1 的 SPI端口
+ gpio_init(MENC15A_1_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); // 配置 MENC15A-1 的 CS端口
+
+ spi_init(MENC15A_2_SPI, SPI_MODE1, MENC15A_2_SPI_SPEED, MENC15A_2_CLK_PIN, MENC15A_2_MOSI_PIN, MENC15A_2_MISO_PIN, SPI_CS_NULL); // 配置 MENC15A-2 的 SPI端口
+ gpio_init(MENC15A_2_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); // 配置 MENC15A-2 的 CS端口
+
+ return 0;
+}
+
diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_menc15a.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_menc15a.h
new file mode 100644
index 0000000..068d877
--- /dev/null
+++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_menc15a.h
@@ -0,0 +1,102 @@
+/*********************************************************************************************************************
+* CYT2BL3 Opensourec Library 即( CYT2BL3 开源库)是一个基于官方 SDK 接口的第三方开源库
+* Copyright (c) 2022 SEEKFREE 逐飞科技
+*
+* 本文件是 CYT2BL3 开源库的一部分
+*
+* CYT2BL3 开源库 是免费软件
+* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
+* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
+*
+* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
+* 甚至没有隐含的适销性或适合特定用途的保证
+* 更多细节请参见 GPL
+*
+* 您应该在收到本开源库的同时收到一份 GPL 的副本
+* 如果没有,请参阅
+*
+* 额外注明:
+* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
+* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
+* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
+* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
+*
+* 文件名称 zf_device_menc15a
+* 公司名称 成都逐飞科技有限公司
+* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
+* 开发环境 IAR 9.40.1
+* 适用平台 CYT2BL3
+* 店铺链接 https://seekfree.taobao.com/
+*
+* 修改记录
+* 日期 作者 备注
+* 2024-11-19 pudding first version
+********************************************************************************************************************/
+/*********************************************************************************************************************
+* 接线定义:
+* ------------------------------------
+* 模块管脚 单片机管脚
+* // 硬件 SPI 引脚
+* CLK 查看 zf_device_menc15a.h 中 MENC15A_CLK_PIN 宏定义
+* MOSI 查看 zf_device_menc15a.h 中 MENC15A_MOSI_PIN 宏定义
+* MISO 查看 zf_device_menc15a.h 中 MENC15A_MISO_PIN 宏定义
+* CS 查看 zf_device_menc15a.h 中 MENC15A_CS_PIN 宏定义
+* VCC 3.3V电源
+* GND 电源地
+* 其余引脚悬空
+* ------------------------------------
+********************************************************************************************************************/
+
+
+#ifndef _zf_device_menc15a_h_
+#define _zf_device_menc15a_h_
+
+#include "zf_common_typedef.h"
+
+//================================================定义 MENC15A 基本配置================================================
+
+//====================================================硬件 SPI 驱动====================================================
+#define MENC15A_1_SPI_SPEED (20 * 1000 * 1000) // 磁编码器1 硬件 SPI 速率
+#define MENC15A_1_SPI (SPI_0 ) // 磁编码器1 硬件 SPI 号
+#define MENC15A_1_CLK_PIN (SPI0_SCLK_P20_11) // 磁编码器1 硬件 SPI SCK 引脚
+#define MENC15A_1_MOSI_PIN (SPI0_MOSI_P20_14) // 磁编码器1 硬件 SPI MOSI 引脚
+#define MENC15A_1_MISO_PIN (SPI0_MISO_P20_12) // 磁编码器1 硬件 SPI MISO 引脚
+#define MENC15A_1_CS_PIN (P20_13) // 磁编码器1 CS 片选引脚
+#define MENC15A_1_CS(x) ((x) ? (gpio_high(MENC15A_1_CS_PIN)) : (gpio_low(MENC15A_1_CS_PIN)))
+
+
+#define MENC15A_2_SPI_SPEED (20 * 1000 * 1000) // 磁编码器2 硬件 SPI 速率
+#define MENC15A_2_SPI (SPI_0 ) // 磁编码器2 硬件 SPI 号
+#define MENC15A_2_CLK_PIN (SPI0_SCLK_P20_11 ) // 磁编码器2 硬件 SPI SCK 引脚
+#define MENC15A_2_MOSI_PIN (SPI0_MOSI_P20_14 ) // 磁编码器2 硬件 SPI MOSI 引脚
+#define MENC15A_2_MISO_PIN (SPI0_MISO_P20_12 ) // 磁编码器2 硬件 SPI MISO 引脚
+#define MENC15A_2_CS_PIN (P20_15) // 磁编码器2 CS 片选引脚
+#define MENC15A_2_CS(x) ((x) ? (gpio_high(MENC15A_2_CS_PIN)) : (gpio_low(MENC15A_2_CS_PIN)))
+
+//====================================================硬件 SPI 驱动====================================================
+
+// 枚举磁编码模块
+typedef enum
+{
+ menc15a_1_module,
+ menc15a_2_module,
+
+}menc15a_module_enum;
+
+//================================================定义 MENC15A 基本配置================================================
+
+
+extern uint16 menc15a_absolute_data[2];
+
+extern int16 menc15a_absolute_offset_data[2];
+
+extern int16 menc15a_speed_data[2];
+
+
+uint16 menc15a_get_absolute_data(menc15a_module_enum menc15a_module);
+int16 menc15a_get_speed_data(menc15a_module_enum menc15a_module);
+
+uint8 menc15a_init(void);
+
+
+#endif
diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_uart_receiver.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_uart_receiver.c
index 3ebb3bd..ade446d 100644
--- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_uart_receiver.c
+++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_uart_receiver.c
@@ -91,7 +91,7 @@ static void uart_receiver_analysis (uart_receiver_struct *remote_data,uint8 * bu
remote_data->channel[num++] = (buffer[5] >> 1 | buffer[6] << 7 ) & 0x07FF;
remote_data->channel[num++] = (buffer[6] >> 4 | buffer[7] << 4 ) & 0x07FF;
remote_data->channel[num++] = (buffer[7] >> 7 | buffer[8] << 1 | buffer[9] << 9 ) & 0x07FF;
- remote_data->state = (SBUS_NORMAL_STATE == buffer[23]) ? 1 : 0;
+ remote_data->state = (SBUS_ABNORMAL_STATE == (buffer[23] & SBUS_ABNORMAL_STATE)) ? 0 : 1;
uart_receiver.finsh_flag = 1;
}
diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_uart_receiver.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_uart_receiver.h
index 948ab2f..6498dcb 100644
--- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_uart_receiver.h
+++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_uart_receiver.h
@@ -55,8 +55,7 @@
#define REV_DATA_LEN ( 25 ) // SBUS帧长
#define FRAME_STAR ( 0X0F ) // 帧头信息
#define FRAME_END ( 0X00 ) // 帧尾信息
-#define SBUS_NORMAL_STATE ( 0X03 ) // 正常状态
-#define SBUS_ABNORMAL_STATE ( 0X0F ) // 失控状态
+#define SBUS_ABNORMAL_STATE ( 0X04 ) // 失控状态
typedef struct
{
diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
index 1c96965..40d9e28 100644
--- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
+++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
@@ -88,6 +88,8 @@ zf_device_uart_receiver.h SUBS
zf_device_absolute_encoder.h 360° 位置传感器 绝对式迷你 mini 编码器 分辨率:0.088°
+zf_device_menc15a.h 15位高精度磁编码器驱动 位置式
+
zf_device_gnss.h GPS 及 RTK 定位模块 双频高精度定位模块 亚米级定位
zf_device_key.h GPIO 按键驱动 用于检测主板按键状态
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 f817dd9..d74841c 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
@@ -766,11 +766,11 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name
IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕 首次发送数据 此时接收缓冲区无数据
IfxQspi_writeTransmitFifo(moudle, (uint8)(register_name & 0x00FF)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 1); // 等待接收完毕 再次发送数据 此时接收缓冲区有1个数据
spi_clear_fifo(moudle); // 清除接收缓存区
@@ -818,11 +818,11 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name,
IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕 首次发送数据 此时接收缓冲区无数据
IfxQspi_writeTransmitFifo(moudle, (uint8)(register_name & 0x00FF)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 1); // 等待接收完毕 再次发送数据 此时接收缓冲区有1个数据
spi_clear_fifo(moudle); // 清除接收缓存区
diff --git a/Example/E15_fft_demo/libraries/doc/version.txt b/Example/E15_fft_demo/libraries/doc/version.txt
index f45bf81..4df6214 100644
--- a/Example/E15_fft_demo/libraries/doc/version.txt
+++ b/Example/E15_fft_demo/libraries/doc/version.txt
@@ -1,3 +1,7 @@
+V3.3.2
+ 新增zf_device_menc15a磁编码器外设驱动
+ 更改uart接收机部分语句
+ 修正SPI的16位通讯错位问题
V3.3.1
移除正交编码器的断言检测
新增重命名工程工具
diff --git a/Example/E15_fft_demo/libraries/zf_common/zf_common_headfile.h b/Example/E15_fft_demo/libraries/zf_common/zf_common_headfile.h
index 3a140e3..c8f75f2 100644
--- a/Example/E15_fft_demo/libraries/zf_common/zf_common_headfile.h
+++ b/Example/E15_fft_demo/libraries/zf_common/zf_common_headfile.h
@@ -93,6 +93,7 @@
#include "zf_device_ips114.h"
#include "zf_device_ips200.h"
#include "zf_device_key.h"
+#include "zf_device_menc15a.h"
#include "zf_device_mpu6050.h"
#include "zf_device_mt9v03x.h"
#include "zf_device_oled.h"
diff --git a/Example/E15_fft_demo/libraries/zf_components/seekfree_assistant_interface.c b/Example/E15_fft_demo/libraries/zf_components/seekfree_assistant_interface.c
index cc42e43..adfc4a3 100644
--- a/Example/E15_fft_demo/libraries/zf_components/seekfree_assistant_interface.c
+++ b/Example/E15_fft_demo/libraries/zf_components/seekfree_assistant_interface.c
@@ -91,8 +91,10 @@ ZF_WEAK void seekfree_assistant_interface_init (seekfree_assistant_transfer_devi
{
case SEEKFREE_ASSISTANT_DEBUG_UART:
{
+#if DEBUG_UART_USE_INTERRUPT == 1
seekfree_assistant_transfer_callback = debug_send_buffer;
seekfree_assistant_receive_callback = debug_read_ring_buffer;
+#endif
}break;
case SEEKFREE_ASSISTANT_WIRELESS_UART:
diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_menc15a.c b/Example/E15_fft_demo/libraries/zf_device/zf_device_menc15a.c
new file mode 100644
index 0000000..faaeba2
--- /dev/null
+++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_menc15a.c
@@ -0,0 +1,188 @@
+/*********************************************************************************************************************
+* CYT2BL3 Opensourec Library 即( CYT2BL3 开源库)是一个基于官方 SDK 接口的第三方开源库
+* Copyright (c) 2022 SEEKFREE 逐飞科技
+*
+* 本文件是 CYT2BL3 开源库的一部分
+*
+* CYT2BL3 开源库 是免费软件
+* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
+* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
+*
+* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
+* 甚至没有隐含的适销性或适合特定用途的保证
+* 更多细节请参见 GPL
+*
+* 您应该在收到本开源库的同时收到一份 GPL 的副本
+* 如果没有,请参阅
+*
+* 额外注明:
+* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
+* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
+* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
+* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
+*
+* 文件名称 zf_device_menc15a
+* 公司名称 成都逐飞科技有限公司
+* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
+* 开发环境 IAR 9.40.1
+* 适用平台 CYT2BL3
+* 店铺链接 https://seekfree.taobao.com/
+*
+* 修改记录
+* 日期 作者 备注
+* 2024-11-19 pudding first version
+********************************************************************************************************************/
+/*********************************************************************************************************************
+* 接线定义:
+* ------------------------------------
+* 模块管脚 单片机管脚
+* // 硬件 SPI 引脚
+* SCL/SPC 查看 zf_device_menc15a.h 中 MENC15A_SPC_PIN 宏定义
+* SDA/DSI 查看 zf_device_menc15a.h 中 MENC15A_SDI_PIN 宏定义
+* SA0/SDO 查看 zf_device_menc15a.h 中 MENC15A_SDO_PIN 宏定义
+* CS 查看 zf_device_menc15a.h 中 MENC15A_CS_PIN 宏定义
+* VCC 3.3V电源
+* GND 电源地
+* 其余引脚悬空
+* ------------------------------------
+********************************************************************************************************************/
+
+#include "zf_common_debug.h"
+#include "zf_common_function.h"
+#include "zf_device_config.h"
+#include "zf_driver_delay.h"
+#include "zf_driver_gpio.h"
+#include "zf_driver_spi.h"
+
+#include "zf_device_menc15a.h"
+
+uint16 menc15a_absolute_data[2] = {0};
+
+int16 menc15a_absolute_offset_data[2] = {0};
+
+int16 menc15a_speed_data[2] = {0};
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 计算编码器旋转偏差
+// 参数说明 encoder_max 编码器精度 填写十进制数据
+// 参数说明 now_location 当前位置信息
+// 参数说明 last_location 上一次的位置信息
+// 返回参数 int32 计算的偏差值
+// 使用示例 magnetic_encoder_get_offset();
+// 备注信息
+//-------------------------------------------------------------------------------------------------------------------
+static int32 magnetic_encoder_get_offset (int32 encoder_max, int32 now_location, int32 last_location)
+{
+ int32 result_data = 0;
+
+ if((encoder_max / 2) < func_abs(now_location - last_location))
+ {
+ result_data = ((encoder_max / 2) < now_location ? (now_location - encoder_max - last_location) : (now_location + encoder_max - last_location));
+ }
+ else
+ {
+ result_data = (now_location - last_location);
+ }
+
+ return result_data;
+}
+
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 获取 MENC15A 磁编码器 的 绝对值 角度数据
+// 参数说明 menc15a_module 磁编码器 模块号
+// 返回参数 uint16 绝对值 角度数据
+// 使用示例 menc15a_1_get_absolute_data();
+// 备注信息 执行该函数后,可直接使用返回值 也可以通过查询对应变量获取结果
+//-------------------------------------------------------------------------------------------------------------------
+uint16 menc15a_get_absolute_data(menc15a_module_enum menc15a_module)
+{
+ uint16 read_data = 0;
+
+ uint16 data_last = menc15a_absolute_data[menc15a_module];
+
+ if(menc15a_module == menc15a_1_module)
+ {
+ MENC15A_1_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_1_SPI, 0x8021);
+
+ MENC15A_1_CS(1);
+ }
+ else
+ {
+ MENC15A_2_CS(0);
+
+ spi_write_8bit(MENC15A_2_SPI, 0x80);
+ spi_write_8bit(MENC15A_2_SPI, 0x21);
+ read_data = spi_read_8bit(MENC15A_2_SPI);
+ read_data = ((read_data << 8) | spi_read_8bit(MENC15A_2_SPI));
+
+ MENC15A_2_CS(1);
+ }
+
+ menc15a_absolute_data[menc15a_module] = (read_data & 0x7fff);
+
+ menc15a_absolute_offset_data[menc15a_module] = (int16)magnetic_encoder_get_offset(32768, menc15a_absolute_data[menc15a_module], data_last);
+
+ return menc15a_absolute_data[menc15a_module];
+}
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 获取 MENC15A 磁编码器 的 转速数据
+// 参数说明 menc15a_module 磁编码器 模块号
+// 返回参数 int16 转速数据(每秒旋转弧度 rad/s)
+// 使用示例 menc15a_1_get_speed_data();
+// 备注信息 执行该函数后,可直接使用返回值 也可以通过查询对应变量获取结果
+//-------------------------------------------------------------------------------------------------------------------
+int16 menc15a_get_speed_data(menc15a_module_enum menc15a_module)
+{
+ int16 read_data = 0;
+
+ if(menc15a_module == menc15a_1_module)
+ {
+ MENC15A_1_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_1_SPI, 0x8032);
+
+ MENC15A_1_CS(1);
+ }
+ else
+ {
+ MENC15A_2_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_2_SPI, 0x8032);
+
+ MENC15A_2_CS(1);
+ }
+
+ read_data = (read_data & 0x7fff);
+
+ if(read_data > 16384)
+ {
+ read_data = read_data - 32768;
+ }
+
+ menc15a_speed_data[menc15a_module] = (int16)((float)read_data * 1.917476f);
+
+ return menc15a_speed_data[menc15a_module];
+}
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 初始化 MENC15A
+// 参数说明 void
+// 返回参数 uint8 1-初始化失败 0-初始化成功
+// 使用示例 menc15a_init();
+// 备注信息
+//-------------------------------------------------------------------------------------------------------------------
+uint8 menc15a_init(void)
+{
+ spi_init(MENC15A_1_SPI, SPI_MODE1, MENC15A_1_SPI_SPEED, MENC15A_1_CLK_PIN, MENC15A_1_MOSI_PIN, MENC15A_1_MISO_PIN, SPI_CS_NULL); // 配置 MENC15A-1 的 SPI端口
+ gpio_init(MENC15A_1_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); // 配置 MENC15A-1 的 CS端口
+
+ spi_init(MENC15A_2_SPI, SPI_MODE1, MENC15A_2_SPI_SPEED, MENC15A_2_CLK_PIN, MENC15A_2_MOSI_PIN, MENC15A_2_MISO_PIN, SPI_CS_NULL); // 配置 MENC15A-2 的 SPI端口
+ gpio_init(MENC15A_2_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); // 配置 MENC15A-2 的 CS端口
+
+ return 0;
+}
+
diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_menc15a.h b/Example/E15_fft_demo/libraries/zf_device/zf_device_menc15a.h
new file mode 100644
index 0000000..068d877
--- /dev/null
+++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_menc15a.h
@@ -0,0 +1,102 @@
+/*********************************************************************************************************************
+* CYT2BL3 Opensourec Library 即( CYT2BL3 开源库)是一个基于官方 SDK 接口的第三方开源库
+* Copyright (c) 2022 SEEKFREE 逐飞科技
+*
+* 本文件是 CYT2BL3 开源库的一部分
+*
+* CYT2BL3 开源库 是免费软件
+* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
+* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
+*
+* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
+* 甚至没有隐含的适销性或适合特定用途的保证
+* 更多细节请参见 GPL
+*
+* 您应该在收到本开源库的同时收到一份 GPL 的副本
+* 如果没有,请参阅
+*
+* 额外注明:
+* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
+* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
+* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
+* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
+*
+* 文件名称 zf_device_menc15a
+* 公司名称 成都逐飞科技有限公司
+* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
+* 开发环境 IAR 9.40.1
+* 适用平台 CYT2BL3
+* 店铺链接 https://seekfree.taobao.com/
+*
+* 修改记录
+* 日期 作者 备注
+* 2024-11-19 pudding first version
+********************************************************************************************************************/
+/*********************************************************************************************************************
+* 接线定义:
+* ------------------------------------
+* 模块管脚 单片机管脚
+* // 硬件 SPI 引脚
+* CLK 查看 zf_device_menc15a.h 中 MENC15A_CLK_PIN 宏定义
+* MOSI 查看 zf_device_menc15a.h 中 MENC15A_MOSI_PIN 宏定义
+* MISO 查看 zf_device_menc15a.h 中 MENC15A_MISO_PIN 宏定义
+* CS 查看 zf_device_menc15a.h 中 MENC15A_CS_PIN 宏定义
+* VCC 3.3V电源
+* GND 电源地
+* 其余引脚悬空
+* ------------------------------------
+********************************************************************************************************************/
+
+
+#ifndef _zf_device_menc15a_h_
+#define _zf_device_menc15a_h_
+
+#include "zf_common_typedef.h"
+
+//================================================定义 MENC15A 基本配置================================================
+
+//====================================================硬件 SPI 驱动====================================================
+#define MENC15A_1_SPI_SPEED (20 * 1000 * 1000) // 磁编码器1 硬件 SPI 速率
+#define MENC15A_1_SPI (SPI_0 ) // 磁编码器1 硬件 SPI 号
+#define MENC15A_1_CLK_PIN (SPI0_SCLK_P20_11) // 磁编码器1 硬件 SPI SCK 引脚
+#define MENC15A_1_MOSI_PIN (SPI0_MOSI_P20_14) // 磁编码器1 硬件 SPI MOSI 引脚
+#define MENC15A_1_MISO_PIN (SPI0_MISO_P20_12) // 磁编码器1 硬件 SPI MISO 引脚
+#define MENC15A_1_CS_PIN (P20_13) // 磁编码器1 CS 片选引脚
+#define MENC15A_1_CS(x) ((x) ? (gpio_high(MENC15A_1_CS_PIN)) : (gpio_low(MENC15A_1_CS_PIN)))
+
+
+#define MENC15A_2_SPI_SPEED (20 * 1000 * 1000) // 磁编码器2 硬件 SPI 速率
+#define MENC15A_2_SPI (SPI_0 ) // 磁编码器2 硬件 SPI 号
+#define MENC15A_2_CLK_PIN (SPI0_SCLK_P20_11 ) // 磁编码器2 硬件 SPI SCK 引脚
+#define MENC15A_2_MOSI_PIN (SPI0_MOSI_P20_14 ) // 磁编码器2 硬件 SPI MOSI 引脚
+#define MENC15A_2_MISO_PIN (SPI0_MISO_P20_12 ) // 磁编码器2 硬件 SPI MISO 引脚
+#define MENC15A_2_CS_PIN (P20_15) // 磁编码器2 CS 片选引脚
+#define MENC15A_2_CS(x) ((x) ? (gpio_high(MENC15A_2_CS_PIN)) : (gpio_low(MENC15A_2_CS_PIN)))
+
+//====================================================硬件 SPI 驱动====================================================
+
+// 枚举磁编码模块
+typedef enum
+{
+ menc15a_1_module,
+ menc15a_2_module,
+
+}menc15a_module_enum;
+
+//================================================定义 MENC15A 基本配置================================================
+
+
+extern uint16 menc15a_absolute_data[2];
+
+extern int16 menc15a_absolute_offset_data[2];
+
+extern int16 menc15a_speed_data[2];
+
+
+uint16 menc15a_get_absolute_data(menc15a_module_enum menc15a_module);
+int16 menc15a_get_speed_data(menc15a_module_enum menc15a_module);
+
+uint8 menc15a_init(void);
+
+
+#endif
diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_uart_receiver.c b/Example/E15_fft_demo/libraries/zf_device/zf_device_uart_receiver.c
index 3ebb3bd..ade446d 100644
--- a/Example/E15_fft_demo/libraries/zf_device/zf_device_uart_receiver.c
+++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_uart_receiver.c
@@ -91,7 +91,7 @@ static void uart_receiver_analysis (uart_receiver_struct *remote_data,uint8 * bu
remote_data->channel[num++] = (buffer[5] >> 1 | buffer[6] << 7 ) & 0x07FF;
remote_data->channel[num++] = (buffer[6] >> 4 | buffer[7] << 4 ) & 0x07FF;
remote_data->channel[num++] = (buffer[7] >> 7 | buffer[8] << 1 | buffer[9] << 9 ) & 0x07FF;
- remote_data->state = (SBUS_NORMAL_STATE == buffer[23]) ? 1 : 0;
+ remote_data->state = (SBUS_ABNORMAL_STATE == (buffer[23] & SBUS_ABNORMAL_STATE)) ? 0 : 1;
uart_receiver.finsh_flag = 1;
}
diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_uart_receiver.h b/Example/E15_fft_demo/libraries/zf_device/zf_device_uart_receiver.h
index 948ab2f..6498dcb 100644
--- a/Example/E15_fft_demo/libraries/zf_device/zf_device_uart_receiver.h
+++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_uart_receiver.h
@@ -55,8 +55,7 @@
#define REV_DATA_LEN ( 25 ) // SBUS帧长
#define FRAME_STAR ( 0X0F ) // 帧头信息
#define FRAME_END ( 0X00 ) // 帧尾信息
-#define SBUS_NORMAL_STATE ( 0X03 ) // 正常状态
-#define SBUS_ABNORMAL_STATE ( 0X0F ) // 失控状态
+#define SBUS_ABNORMAL_STATE ( 0X04 ) // 失控状态
typedef struct
{
diff --git a/Example/E15_fft_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt b/Example/E15_fft_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
index 1c96965..40d9e28 100644
--- a/Example/E15_fft_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
+++ b/Example/E15_fft_demo/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
@@ -88,6 +88,8 @@ zf_device_uart_receiver.h SUBS
zf_device_absolute_encoder.h 360° 位置传感器 绝对式迷你 mini 编码器 分辨率:0.088°
+zf_device_menc15a.h 15位高精度磁编码器驱动 位置式
+
zf_device_gnss.h GPS 及 RTK 定位模块 双频高精度定位模块 亚米级定位
zf_device_key.h GPIO 按键驱动 用于检测主板按键状态
diff --git a/Example/E15_fft_demo/libraries/zf_driver/zf_driver_spi.c b/Example/E15_fft_demo/libraries/zf_driver/zf_driver_spi.c
index f817dd9..d74841c 100644
--- a/Example/E15_fft_demo/libraries/zf_driver/zf_driver_spi.c
+++ b/Example/E15_fft_demo/libraries/zf_driver/zf_driver_spi.c
@@ -766,11 +766,11 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name
IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕 首次发送数据 此时接收缓冲区无数据
IfxQspi_writeTransmitFifo(moudle, (uint8)(register_name & 0x00FF)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 1); // 等待接收完毕 再次发送数据 此时接收缓冲区有1个数据
spi_clear_fifo(moudle); // 清除接收缓存区
@@ -818,11 +818,11 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name,
IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕 首次发送数据 此时接收缓冲区无数据
IfxQspi_writeTransmitFifo(moudle, (uint8)(register_name & 0x00FF)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 1); // 等待接收完毕 再次发送数据 此时接收缓冲区有1个数据
spi_clear_fifo(moudle); // 清除接收缓存区
diff --git a/Seekfree_TC264_Opensource_Library/libraries/doc/version.txt b/Seekfree_TC264_Opensource_Library/libraries/doc/version.txt
index f45bf81..4df6214 100644
--- a/Seekfree_TC264_Opensource_Library/libraries/doc/version.txt
+++ b/Seekfree_TC264_Opensource_Library/libraries/doc/version.txt
@@ -1,3 +1,7 @@
+V3.3.2
+ 新增zf_device_menc15a磁编码器外设驱动
+ 更改uart接收机部分语句
+ 修正SPI的16位通讯错位问题
V3.3.1
移除正交编码器的断言检测
新增重命名工程工具
diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_common/zf_common_headfile.h b/Seekfree_TC264_Opensource_Library/libraries/zf_common/zf_common_headfile.h
index 3a140e3..c8f75f2 100644
--- a/Seekfree_TC264_Opensource_Library/libraries/zf_common/zf_common_headfile.h
+++ b/Seekfree_TC264_Opensource_Library/libraries/zf_common/zf_common_headfile.h
@@ -93,6 +93,7 @@
#include "zf_device_ips114.h"
#include "zf_device_ips200.h"
#include "zf_device_key.h"
+#include "zf_device_menc15a.h"
#include "zf_device_mpu6050.h"
#include "zf_device_mt9v03x.h"
#include "zf_device_oled.h"
diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_components/seekfree_assistant_interface.c b/Seekfree_TC264_Opensource_Library/libraries/zf_components/seekfree_assistant_interface.c
index cc42e43..adfc4a3 100644
--- a/Seekfree_TC264_Opensource_Library/libraries/zf_components/seekfree_assistant_interface.c
+++ b/Seekfree_TC264_Opensource_Library/libraries/zf_components/seekfree_assistant_interface.c
@@ -91,8 +91,10 @@ ZF_WEAK void seekfree_assistant_interface_init (seekfree_assistant_transfer_devi
{
case SEEKFREE_ASSISTANT_DEBUG_UART:
{
+#if DEBUG_UART_USE_INTERRUPT == 1
seekfree_assistant_transfer_callback = debug_send_buffer;
seekfree_assistant_receive_callback = debug_read_ring_buffer;
+#endif
}break;
case SEEKFREE_ASSISTANT_WIRELESS_UART:
diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_menc15a.c b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_menc15a.c
new file mode 100644
index 0000000..faaeba2
--- /dev/null
+++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_menc15a.c
@@ -0,0 +1,188 @@
+/*********************************************************************************************************************
+* CYT2BL3 Opensourec Library 即( CYT2BL3 开源库)是一个基于官方 SDK 接口的第三方开源库
+* Copyright (c) 2022 SEEKFREE 逐飞科技
+*
+* 本文件是 CYT2BL3 开源库的一部分
+*
+* CYT2BL3 开源库 是免费软件
+* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
+* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
+*
+* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
+* 甚至没有隐含的适销性或适合特定用途的保证
+* 更多细节请参见 GPL
+*
+* 您应该在收到本开源库的同时收到一份 GPL 的副本
+* 如果没有,请参阅
+*
+* 额外注明:
+* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
+* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
+* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
+* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
+*
+* 文件名称 zf_device_menc15a
+* 公司名称 成都逐飞科技有限公司
+* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
+* 开发环境 IAR 9.40.1
+* 适用平台 CYT2BL3
+* 店铺链接 https://seekfree.taobao.com/
+*
+* 修改记录
+* 日期 作者 备注
+* 2024-11-19 pudding first version
+********************************************************************************************************************/
+/*********************************************************************************************************************
+* 接线定义:
+* ------------------------------------
+* 模块管脚 单片机管脚
+* // 硬件 SPI 引脚
+* SCL/SPC 查看 zf_device_menc15a.h 中 MENC15A_SPC_PIN 宏定义
+* SDA/DSI 查看 zf_device_menc15a.h 中 MENC15A_SDI_PIN 宏定义
+* SA0/SDO 查看 zf_device_menc15a.h 中 MENC15A_SDO_PIN 宏定义
+* CS 查看 zf_device_menc15a.h 中 MENC15A_CS_PIN 宏定义
+* VCC 3.3V电源
+* GND 电源地
+* 其余引脚悬空
+* ------------------------------------
+********************************************************************************************************************/
+
+#include "zf_common_debug.h"
+#include "zf_common_function.h"
+#include "zf_device_config.h"
+#include "zf_driver_delay.h"
+#include "zf_driver_gpio.h"
+#include "zf_driver_spi.h"
+
+#include "zf_device_menc15a.h"
+
+uint16 menc15a_absolute_data[2] = {0};
+
+int16 menc15a_absolute_offset_data[2] = {0};
+
+int16 menc15a_speed_data[2] = {0};
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 计算编码器旋转偏差
+// 参数说明 encoder_max 编码器精度 填写十进制数据
+// 参数说明 now_location 当前位置信息
+// 参数说明 last_location 上一次的位置信息
+// 返回参数 int32 计算的偏差值
+// 使用示例 magnetic_encoder_get_offset();
+// 备注信息
+//-------------------------------------------------------------------------------------------------------------------
+static int32 magnetic_encoder_get_offset (int32 encoder_max, int32 now_location, int32 last_location)
+{
+ int32 result_data = 0;
+
+ if((encoder_max / 2) < func_abs(now_location - last_location))
+ {
+ result_data = ((encoder_max / 2) < now_location ? (now_location - encoder_max - last_location) : (now_location + encoder_max - last_location));
+ }
+ else
+ {
+ result_data = (now_location - last_location);
+ }
+
+ return result_data;
+}
+
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 获取 MENC15A 磁编码器 的 绝对值 角度数据
+// 参数说明 menc15a_module 磁编码器 模块号
+// 返回参数 uint16 绝对值 角度数据
+// 使用示例 menc15a_1_get_absolute_data();
+// 备注信息 执行该函数后,可直接使用返回值 也可以通过查询对应变量获取结果
+//-------------------------------------------------------------------------------------------------------------------
+uint16 menc15a_get_absolute_data(menc15a_module_enum menc15a_module)
+{
+ uint16 read_data = 0;
+
+ uint16 data_last = menc15a_absolute_data[menc15a_module];
+
+ if(menc15a_module == menc15a_1_module)
+ {
+ MENC15A_1_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_1_SPI, 0x8021);
+
+ MENC15A_1_CS(1);
+ }
+ else
+ {
+ MENC15A_2_CS(0);
+
+ spi_write_8bit(MENC15A_2_SPI, 0x80);
+ spi_write_8bit(MENC15A_2_SPI, 0x21);
+ read_data = spi_read_8bit(MENC15A_2_SPI);
+ read_data = ((read_data << 8) | spi_read_8bit(MENC15A_2_SPI));
+
+ MENC15A_2_CS(1);
+ }
+
+ menc15a_absolute_data[menc15a_module] = (read_data & 0x7fff);
+
+ menc15a_absolute_offset_data[menc15a_module] = (int16)magnetic_encoder_get_offset(32768, menc15a_absolute_data[menc15a_module], data_last);
+
+ return menc15a_absolute_data[menc15a_module];
+}
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 获取 MENC15A 磁编码器 的 转速数据
+// 参数说明 menc15a_module 磁编码器 模块号
+// 返回参数 int16 转速数据(每秒旋转弧度 rad/s)
+// 使用示例 menc15a_1_get_speed_data();
+// 备注信息 执行该函数后,可直接使用返回值 也可以通过查询对应变量获取结果
+//-------------------------------------------------------------------------------------------------------------------
+int16 menc15a_get_speed_data(menc15a_module_enum menc15a_module)
+{
+ int16 read_data = 0;
+
+ if(menc15a_module == menc15a_1_module)
+ {
+ MENC15A_1_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_1_SPI, 0x8032);
+
+ MENC15A_1_CS(1);
+ }
+ else
+ {
+ MENC15A_2_CS(0);
+
+ read_data = spi_read_16bit_register(MENC15A_2_SPI, 0x8032);
+
+ MENC15A_2_CS(1);
+ }
+
+ read_data = (read_data & 0x7fff);
+
+ if(read_data > 16384)
+ {
+ read_data = read_data - 32768;
+ }
+
+ menc15a_speed_data[menc15a_module] = (int16)((float)read_data * 1.917476f);
+
+ return menc15a_speed_data[menc15a_module];
+}
+
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 初始化 MENC15A
+// 参数说明 void
+// 返回参数 uint8 1-初始化失败 0-初始化成功
+// 使用示例 menc15a_init();
+// 备注信息
+//-------------------------------------------------------------------------------------------------------------------
+uint8 menc15a_init(void)
+{
+ spi_init(MENC15A_1_SPI, SPI_MODE1, MENC15A_1_SPI_SPEED, MENC15A_1_CLK_PIN, MENC15A_1_MOSI_PIN, MENC15A_1_MISO_PIN, SPI_CS_NULL); // 配置 MENC15A-1 的 SPI端口
+ gpio_init(MENC15A_1_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); // 配置 MENC15A-1 的 CS端口
+
+ spi_init(MENC15A_2_SPI, SPI_MODE1, MENC15A_2_SPI_SPEED, MENC15A_2_CLK_PIN, MENC15A_2_MOSI_PIN, MENC15A_2_MISO_PIN, SPI_CS_NULL); // 配置 MENC15A-2 的 SPI端口
+ gpio_init(MENC15A_2_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); // 配置 MENC15A-2 的 CS端口
+
+ return 0;
+}
+
diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_menc15a.h b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_menc15a.h
new file mode 100644
index 0000000..068d877
--- /dev/null
+++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_menc15a.h
@@ -0,0 +1,102 @@
+/*********************************************************************************************************************
+* CYT2BL3 Opensourec Library 即( CYT2BL3 开源库)是一个基于官方 SDK 接口的第三方开源库
+* Copyright (c) 2022 SEEKFREE 逐飞科技
+*
+* 本文件是 CYT2BL3 开源库的一部分
+*
+* CYT2BL3 开源库 是免费软件
+* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
+* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
+*
+* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
+* 甚至没有隐含的适销性或适合特定用途的保证
+* 更多细节请参见 GPL
+*
+* 您应该在收到本开源库的同时收到一份 GPL 的副本
+* 如果没有,请参阅
+*
+* 额外注明:
+* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
+* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
+* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
+* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
+*
+* 文件名称 zf_device_menc15a
+* 公司名称 成都逐飞科技有限公司
+* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
+* 开发环境 IAR 9.40.1
+* 适用平台 CYT2BL3
+* 店铺链接 https://seekfree.taobao.com/
+*
+* 修改记录
+* 日期 作者 备注
+* 2024-11-19 pudding first version
+********************************************************************************************************************/
+/*********************************************************************************************************************
+* 接线定义:
+* ------------------------------------
+* 模块管脚 单片机管脚
+* // 硬件 SPI 引脚
+* CLK 查看 zf_device_menc15a.h 中 MENC15A_CLK_PIN 宏定义
+* MOSI 查看 zf_device_menc15a.h 中 MENC15A_MOSI_PIN 宏定义
+* MISO 查看 zf_device_menc15a.h 中 MENC15A_MISO_PIN 宏定义
+* CS 查看 zf_device_menc15a.h 中 MENC15A_CS_PIN 宏定义
+* VCC 3.3V电源
+* GND 电源地
+* 其余引脚悬空
+* ------------------------------------
+********************************************************************************************************************/
+
+
+#ifndef _zf_device_menc15a_h_
+#define _zf_device_menc15a_h_
+
+#include "zf_common_typedef.h"
+
+//================================================定义 MENC15A 基本配置================================================
+
+//====================================================硬件 SPI 驱动====================================================
+#define MENC15A_1_SPI_SPEED (20 * 1000 * 1000) // 磁编码器1 硬件 SPI 速率
+#define MENC15A_1_SPI (SPI_0 ) // 磁编码器1 硬件 SPI 号
+#define MENC15A_1_CLK_PIN (SPI0_SCLK_P20_11) // 磁编码器1 硬件 SPI SCK 引脚
+#define MENC15A_1_MOSI_PIN (SPI0_MOSI_P20_14) // 磁编码器1 硬件 SPI MOSI 引脚
+#define MENC15A_1_MISO_PIN (SPI0_MISO_P20_12) // 磁编码器1 硬件 SPI MISO 引脚
+#define MENC15A_1_CS_PIN (P20_13) // 磁编码器1 CS 片选引脚
+#define MENC15A_1_CS(x) ((x) ? (gpio_high(MENC15A_1_CS_PIN)) : (gpio_low(MENC15A_1_CS_PIN)))
+
+
+#define MENC15A_2_SPI_SPEED (20 * 1000 * 1000) // 磁编码器2 硬件 SPI 速率
+#define MENC15A_2_SPI (SPI_0 ) // 磁编码器2 硬件 SPI 号
+#define MENC15A_2_CLK_PIN (SPI0_SCLK_P20_11 ) // 磁编码器2 硬件 SPI SCK 引脚
+#define MENC15A_2_MOSI_PIN (SPI0_MOSI_P20_14 ) // 磁编码器2 硬件 SPI MOSI 引脚
+#define MENC15A_2_MISO_PIN (SPI0_MISO_P20_12 ) // 磁编码器2 硬件 SPI MISO 引脚
+#define MENC15A_2_CS_PIN (P20_15) // 磁编码器2 CS 片选引脚
+#define MENC15A_2_CS(x) ((x) ? (gpio_high(MENC15A_2_CS_PIN)) : (gpio_low(MENC15A_2_CS_PIN)))
+
+//====================================================硬件 SPI 驱动====================================================
+
+// 枚举磁编码模块
+typedef enum
+{
+ menc15a_1_module,
+ menc15a_2_module,
+
+}menc15a_module_enum;
+
+//================================================定义 MENC15A 基本配置================================================
+
+
+extern uint16 menc15a_absolute_data[2];
+
+extern int16 menc15a_absolute_offset_data[2];
+
+extern int16 menc15a_speed_data[2];
+
+
+uint16 menc15a_get_absolute_data(menc15a_module_enum menc15a_module);
+int16 menc15a_get_speed_data(menc15a_module_enum menc15a_module);
+
+uint8 menc15a_init(void);
+
+
+#endif
diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_uart_receiver.c b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_uart_receiver.c
index 3ebb3bd..ade446d 100644
--- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_uart_receiver.c
+++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_uart_receiver.c
@@ -91,7 +91,7 @@ static void uart_receiver_analysis (uart_receiver_struct *remote_data,uint8 * bu
remote_data->channel[num++] = (buffer[5] >> 1 | buffer[6] << 7 ) & 0x07FF;
remote_data->channel[num++] = (buffer[6] >> 4 | buffer[7] << 4 ) & 0x07FF;
remote_data->channel[num++] = (buffer[7] >> 7 | buffer[8] << 1 | buffer[9] << 9 ) & 0x07FF;
- remote_data->state = (SBUS_NORMAL_STATE == buffer[23]) ? 1 : 0;
+ remote_data->state = (SBUS_ABNORMAL_STATE == (buffer[23] & SBUS_ABNORMAL_STATE)) ? 0 : 1;
uart_receiver.finsh_flag = 1;
}
diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_uart_receiver.h b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_uart_receiver.h
index 948ab2f..6498dcb 100644
--- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_uart_receiver.h
+++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_uart_receiver.h
@@ -55,8 +55,7 @@
#define REV_DATA_LEN ( 25 ) // SBUS帧长
#define FRAME_STAR ( 0X0F ) // 帧头信息
#define FRAME_END ( 0X00 ) // 帧尾信息
-#define SBUS_NORMAL_STATE ( 0X03 ) // 正常状态
-#define SBUS_ABNORMAL_STATE ( 0X0F ) // 失控状态
+#define SBUS_ABNORMAL_STATE ( 0X04 ) // 失控状态
typedef struct
{
diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/澶栬鏂囦欢璇存槑.txt b/Seekfree_TC264_Opensource_Library/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
index 1c96965..40d9e28 100644
--- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
+++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/澶栬鏂囦欢璇存槑.txt
@@ -88,6 +88,8 @@ zf_device_uart_receiver.h SUBS
zf_device_absolute_encoder.h 360° 位置传感器 绝对式迷你 mini 编码器 分辨率:0.088°
+zf_device_menc15a.h 15位高精度磁编码器驱动 位置式
+
zf_device_gnss.h GPS 及 RTK 定位模块 双频高精度定位模块 亚米级定位
zf_device_key.h GPIO 按键驱动 用于检测主板按键状态
diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_driver/zf_driver_spi.c b/Seekfree_TC264_Opensource_Library/libraries/zf_driver/zf_driver_spi.c
index f817dd9..d74841c 100644
--- a/Seekfree_TC264_Opensource_Library/libraries/zf_driver/zf_driver_spi.c
+++ b/Seekfree_TC264_Opensource_Library/libraries/zf_driver/zf_driver_spi.c
@@ -766,11 +766,11 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name
IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕 首次发送数据 此时接收缓冲区无数据
IfxQspi_writeTransmitFifo(moudle, (uint8)(register_name & 0x00FF)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 1); // 等待接收完毕 再次发送数据 此时接收缓冲区有1个数据
spi_clear_fifo(moudle); // 清除接收缓存区
@@ -818,11 +818,11 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name,
IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕 首次发送数据 此时接收缓冲区无数据
IfxQspi_writeTransmitFifo(moudle, (uint8)(register_name & 0x00FF)); // 将发送的数据写入缓冲区
- while(moudle->STATUS.B.RXFIFOLEVEL == 0); // 等待接收完毕
+ while(moudle->STATUS.B.RXFIFOLEVEL == 1); // 等待接收完毕 再次发送数据 此时接收缓冲区有1个数据
spi_clear_fifo(moudle); // 清除接收缓存区