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); // 清除接收缓存区