[单片机框架][drivers层][extend_16ch] 16位恒流驱动芯片 MBI5020 JXI5020GP

news/2024/4/26 11:51:03/文章来源:https://blog.csdn.net/qq_29246181/article/details/130303541

文章目录

  • 一、简介
  • 二、特性
  • 三、 示例代码

一、简介

4pin控制16ping,IO扩展器件

二、特性

  1. 16 个等电流输出通道
  2. 等电流输出值不受输出端负载电压影响等电流范围值,
  3. 3-30mA@VDp=5V;
  4. 3-15mA@Vpp=3.3V
  5. 极为精确的电流输出值,
  6. 通道间差异值: <±1.5%(一般值);<±2.5%(最大值);
  7. 芯片间差异值: <±1.5%(一般值);<±3.0% (最大值)。
  8. 利用一个外接电阻,可设定电流输出值
  9. 快速的输出电流响应, OE: 45ns (保持输出一致性的条件下)高达 25MHz 时钟频率
  10. 具 Schmitt trigger 输入
  11. 装置操作电压: 3.3/5 伏特
  12. 封装湿度敏感等级:3

三、 示例代码

/********************************************************************************
* @file    extend_16ch.c
* @author  jianqiang.xue
* @version V1.0.0
* @date    2023-04-07
* @brief   16位恒流驱动芯片 MBI5020 JXI5020GP对于ARM_M平台 @16M
1个NOP:(1/24000000)*1000*1000*1000==41.67ns
__NOP(); __NOP(); __NOP(); __NOP(); __NOP();      \
对于n76e003平台 @16M
1个nop      占用87ns
while(1)    占用194ns
函数调用     占用570ns如果没有APP_IO,则需要在外部实现该结构体
static const extend_16ch_gpio_t io = {.clk_pin = {GPIOC, GPIO_PIN_5, GPIO_CLK(GPIOC)},.sdi_pin = {GPIOC, GPIO_PIN_6, GPIO_CLK(GPIOC)},.le_pin = {GPIOC, GPIO_PIN_4, GPIO_CLK(GPIOC)},.oe_pin = {GPIOC, GPIO_PIN_3, GPIO_CLK(GPIOC)},
}
********************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
#include <stdbool.h>
#include <string.h>/* Private Includes ----------------------------------------------------------*/
#include "extend_16ch.h"
#include "bsp_gpio.h"#ifdef LISUN_SDK
#include "ls_gpio.h"
#include "ls_syscfg.h"
#endif/* Private Define ------------------------------------------------------------*/
/* Private Typedef -----------------------------------------------------------*/
/* Private Macro -------------------------------------------------------------*/
/* Private Variables ---------------------------------------------------------*/
#ifndef APP_IO
#define GPIO_APBx                                   (0)
#else
#include "app_io.h"
#include "bsp_pwm.h"
#define PWMx    g_io.type[io->oe_pin]-IO_TYPE_TIM1_CH1
#endif
/* Private Function Prototypes -----------------------------------------------*/
/* Public Function Prototypes ------------------------------------------------*/
/*** @brief  器件硬件初始化* @param  *io: 引脚配置*/
void extend_16ch_init(extend_16ch_gpio_t *io) {
#ifndef APP_IO/* Enable the GPIO Clock */bsp_gpio_set_clk(GPIO_APBx, io->clk_pin.periph, true);/* Configure the GPIO pin */bsp_gpio_init_output(io->clk_pin.port, io->clk_pin.pin, BSP_GPIO_PIN_OUT_PP);/* Reset PIN to switch off the */bsp_gpio_set_pin(io->clk_pin.port, io->clk_pin.pin, BSP_GPIO_PIN_RESET);/* Enable the GPIO Clock */bsp_gpio_set_clk(GPIO_APBx, io->sdi_pin.periph, true);/* Configure the GPIO pin */bsp_gpio_init_output(io->sdi_pin.port, io->sdi_pin.pin, BSP_GPIO_PIN_OUT_PP);/* Reset PIN to switch off the */bsp_gpio_set_pin(io->sdi_pin.port, io->sdi_pin.pin, BSP_GPIO_PIN_RESET);/* Enable the GPIO Clock */bsp_gpio_set_clk(GPIO_APBx, io->le_pin.periph, true);/* Configure the GPIO pin */bsp_gpio_init_output(io->le_pin.port, io->le_pin.pin, BSP_GPIO_PIN_OUT_PP);/* Reset PIN to switch off the */bsp_gpio_set_pin(io->le_pin.port, io->le_pin.pin, BSP_GPIO_PIN_RESET);/* Enable the GPIO Clock */bsp_gpio_set_clk(GPIO_APBx, io->oe_pin.periph, true);/* Configure the GPIO pin */bsp_gpio_init_output(io->oe_pin.port, io->oe_pin.pin, BSP_GPIO_PIN_OUT_PP);/* Reset PIN to switch off the */bsp_gpio_set_pin(io->oe_pin.port, io->oe_pin.pin, BSP_GPIO_PIN_SET);
#else
#endif
}/*** @brief  注销器件引脚* @param  *io: 引脚配置*/
void extend_16ch_deinit(extend_16ch_gpio_t *io) {
#ifndef APP_IO/* Turn off */bsp_gpio_set_pin(io->clk_pin.port, io->clk_pin.pin, BSP_GPIO_PIN_RESET);/* DeInit the GPIO pin */bsp_gpio_deinit(io->clk_pin.port, io->clk_pin.pin);/* Turn off */bsp_gpio_set_pin(io->sdi_pin.port, io->sdi_pin.pin, BSP_GPIO_PIN_RESET);/* DeInit the GPIO pin */bsp_gpio_deinit(io->sdi_pin.port, io->sdi_pin.pin);/* Turn off */bsp_gpio_set_pin(io->le_pin.port, io->le_pin.pin, BSP_GPIO_PIN_RESET);/* DeInit the GPIO pin */bsp_gpio_deinit(io->le_pin.port, io->le_pin.pin);/* Turn off */bsp_gpio_set_pin(io->oe_pin.port, io->oe_pin.pin, BSP_GPIO_PIN_SET);/* DeInit the GPIO pin */bsp_gpio_deinit(io->oe_pin.port, io->oe_pin.pin);
#else
#endif
}/*** @brief  写入数据* @param  *io: 引脚配置* @param  data[]: IO数据,请以倒叙传入。如U5,U4,U3,U2,U1。* @param  num: 器件数量*/
void extend_16ch_write(extend_16ch_gpio_t *io, uint16_t data[], uint8_t num) {//extend_16ch_close(io);uint16_t temp = 0;uint8_t bit_val = 0;
#ifndef APP_IO// 先关闭器件bsp_gpio_set_pin(io->clk_pin.port, io->clk_pin.pin, BSP_GPIO_PIN_RESET);bsp_gpio_set_pin(io->sdi_pin.port, io->sdi_pin.pin, BSP_GPIO_PIN_RESET);bsp_gpio_set_pin(io->le_pin.port, io->le_pin.pin, BSP_GPIO_PIN_RESET);for (uint8_t i = 0; i < num; i++) {temp = data[i];for (uint8_t bit = 0; bit < 16; bit++) {bit_val = temp & 0x8000 ? 1 : 0;temp <<= 1;if (bit_val)bsp_gpio_set_pin(io->sdi_pin.port, io->sdi_pin.pin, BSP_GPIO_PIN_SET);elsebsp_gpio_set_pin(io->sdi_pin.port, io->sdi_pin.pin, BSP_GPIO_PIN_RESET);bsp_gpio_set_pin(io->clk_pin.port, io->clk_pin.pin, BSP_GPIO_PIN_SET);__NOP();__NOP();bsp_gpio_set_pin(io->clk_pin.port, io->clk_pin.pin, BSP_GPIO_PIN_RESET);__NOP();__NOP();}}bsp_gpio_set_pin(io->le_pin.port, io->le_pin.pin, BSP_GPIO_PIN_SET);__NOP();bsp_gpio_set_pin(io->le_pin.port, io->le_pin.pin, BSP_GPIO_PIN_RESET);__NOP();__NOP();
#else// 先关闭器件bsp_gpio_set_pin(g_io_cfg[io->clk_pin].port, g_io_cfg[io->clk_pin].pin, BSP_GPIO_PIN_RESET);bsp_gpio_set_pin(g_io_cfg[io->sdi_pin].port, g_io_cfg[io->sdi_pin].pin, BSP_GPIO_PIN_RESET);bsp_gpio_set_pin(g_io_cfg[io->le_pin].port, g_io_cfg[io->le_pin].pin, BSP_GPIO_PIN_RESET);for (uint8_t i = 0; i < num; i++) {temp = data[i];for (uint8_t bit = 0; bit < 16; bit++) {bit_val = temp & 0x8000 ? 1 : 0;temp <<= 1;if (bit_val)bsp_gpio_set_pin(g_io_cfg[io->sdi_pin].port, g_io_cfg[io->sdi_pin].pin, BSP_GPIO_PIN_SET);elsebsp_gpio_set_pin(g_io_cfg[io->sdi_pin].port, g_io_cfg[io->sdi_pin].pin, BSP_GPIO_PIN_RESET);bsp_gpio_set_pin(g_io_cfg[io->clk_pin].port, g_io_cfg[io->clk_pin].pin, BSP_GPIO_PIN_SET);__NOP();__NOP();bsp_gpio_set_pin(g_io_cfg[io->clk_pin].port, g_io_cfg[io->clk_pin].pin, BSP_GPIO_PIN_RESET);__NOP();__NOP();}}bsp_gpio_set_pin(g_io_cfg[io->le_pin].port, g_io_cfg[io->le_pin].pin, BSP_GPIO_PIN_SET);__NOP();bsp_gpio_set_pin(g_io_cfg[io->le_pin].port, g_io_cfg[io->le_pin].pin, BSP_GPIO_PIN_RESET);__NOP();__NOP();
#endif//extend_16ch_open(io);
}/*** @brief 器件使能脚--打开* @param io 引脚配置*/
void extend_16ch_open(extend_16ch_gpio_t *io) {
#ifndef APP_IObsp_gpio_set_pin(io->oe_pin.port, io->oe_pin.pin, BSP_GPIO_PIN_RESET);
#elseif (g_io.type[io->oe_pin] == IO_TYPE_OUT_PP) {if (io->valid_level)bsp_gpio_set_pin(g_io_cfg[io->oe_pin].port, g_io_cfg[io->oe_pin].pin, BSP_GPIO_PIN_SET);elsebsp_gpio_set_pin(g_io_cfg[io->oe_pin].port, g_io_cfg[io->oe_pin].pin, BSP_GPIO_PIN_RESET);} else { // 非输出脚,则为PWM模式if (io->valid_level)bsp_pwm_set_pulse(PWMx, bsp_pwm_pp_to_pulse(PWMx, io->intensity_ctrl));elsebsp_pwm_set_pulse(PWMx, bsp_pwm_pp_to_pulse(PWMx, 100 - io->intensity_ctrl));}
#endif
}/*** @brief 器件使能脚--关闭* @param io 引脚配置*/
void extend_16ch_close(extend_16ch_gpio_t *io) {
#ifndef APP_IObsp_gpio_set_pin(io->oe_pin.port, io->oe_pin.pin, BSP_GPIO_PIN_SET);
#elseif (g_io.type[io->oe_pin] == IO_TYPE_OUT_PP) {if (io->valid_level)bsp_gpio_set_pin(g_io_cfg[io->oe_pin].port, g_io_cfg[io->oe_pin].pin, BSP_GPIO_PIN_RESET);elsebsp_gpio_set_pin(g_io_cfg[io->oe_pin].port, g_io_cfg[io->oe_pin].pin, BSP_GPIO_PIN_SET);} else {if (io->valid_level)bsp_pwm_set_pulse(PWMx, 0);elsebsp_pwm_set_pulse(PWMx, -1);}
#endif
}
/********************************************************************************
* @file    extend_16ch.h
* @author  jianqiang.xue
* @version V1.0.0
* @date    2023-04-07
* @brief   16位恒流驱动芯片 MBI5020 JXI5020GP如果没有APP_IO则使用下面方式定义引脚:
static const extend_16ch_gpio_t io = {.clk_pin = {GPIOC, GPIO_PIN_5, GPIO_CLK(GPIOC)},.sdi_pin = {GPIOC, GPIO_PIN_6, GPIO_CLK(GPIOC)},.le_pin = {GPIOC, GPIO_PIN_4, GPIO_CLK(GPIOC)},.oe_pin = {GPIOC, GPIO_PIN_3, GPIO_CLK(GPIOC)},
};如果启动了APP_IO则直接用ID号
#define LS_EXIO_CLK_ID                                             (7)
#define LS_EXIO_DIO_ID                                             (8)
#define LS_EXIO_LE_ID                                              (6)
#define LS_EXIO_OE_ID                                              (5)
static const extend_16ch_gpio_t io = {.clk_pin = LS_EXIO_CLK_ID,.sdi_pin = LS_EXIO_DIO_ID,.le_pin = LS_EXIO_LE_ID,.oe_pin = LS_EXIO_OE_ID,
};
********************************************************************************/#ifndef __EXTEND_16CH_H
#define __EXTEND_16CH_H/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
#include <stdbool.h>
#include "bsp_gpio.h"
/* Public enum ---------------------------------------------------------------*/
/* Public Struct -------------------------------------------------------------*/
#ifndef APP_IO
typedef struct {bsp_gpio2_t clk_pin; // 时钟脚bsp_gpio2_t sdi_pin; // 数据脚bsp_gpio2_t le_pin;  // 锁存 低电平开始准备数据,高电平发送数据bsp_gpio2_t oe_pin;  // 使能脚  低电平打开IO0-IO15的输入,高电平关闭
} extend_16ch_gpio_t;
#else
typedef struct {  // 填写[g_io_cfg]中索引号uint8_t clk_pin;uint8_t sdi_pin;uint8_t le_pin;uint8_t oe_pin;          // 请在syscfg_gui中配置为PWMuint8_t intensity_ctrl;  // 亮度控制,通过调整[oe_pin]占空比uint8_t valid_level;     // 有效电平
} extend_16ch_gpio_t;
#endif
/* Public Function Prototypes ------------------------------------------------*/void extend_16ch_init(extend_16ch_gpio_t *io);
void extend_16ch_deinit(extend_16ch_gpio_t *io);void extend_16ch_write(extend_16ch_gpio_t *io, uint16_t data[], uint8_t num);
void extend_16ch_open(extend_16ch_gpio_t *io);
void extend_16ch_close(extend_16ch_gpio_t *io);#endif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_103400.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

太阳辐射预报模式WRF-SOLAR在农业生态领域中的实践技术应用

太阳能是一种清洁能源&#xff0c;合理有效开发太阳能资源对减少污染、保护环境以及应对气候变化和能源安全具有非常重要的实际意义&#xff0c;为了实现能源和环境的可持续发展&#xff0c;近年来世界各国都高度重视太阳能资源的开发利用&#xff1b;另外太阳辐射的光谱成分、…

这场SIG组开放工作会议为何吸引了那么多人的关注?

【中国&#xff0c;上海&#xff0c;2023年4月20日-21日】openEuler Developer Day 2023在线上和线下同步举办。本次大会由开放原子开源基金会指导&#xff0c;中国软件行业协会、openEuler社区、边缘计算产业联盟共同主办&#xff0c;以“万涓汇流&#xff0c;奔涌向前”为主题…

为什么软件测试外包公司更受软件企业欢迎?软件测试报告需要多少钱?

劳动派遣或劳务派遣的用工模式古已有之&#xff0c;是人力资源销售市场不可避免的态势。软件测试顺应时代开展检测业务外包这一行业细分领域&#xff0c;越来越多软件外包公司尤其是小微型企业慢慢意识到了软件测试业务外包通常能够持续减少企业的各种成本费&#xff0c;使企业…

关于Vue中使用全屏容器无法占满屏幕以及样式不生效问题解决方案

先来看示例问题 App.vue文件 global.css文件 网页效果 可以看到即使设置了宽度和高度为100%都无法占满屏幕&#xff0c;而且容器还超出了屏幕&#xff0c;上拉才可以看到下边框。查看网上解决方法&#xff1a; 1.height设置为100vh&#xff0c; 或者设置为calc&#xff08;10…

crm day03 创建市场活动

页面切割 div切割&#xff0c;ifram显示 如何分割的呢&#xff0c;在主页面上打开iframe $(function(){ //页面加载时window.open("workbench/main/index.do","workareaFrame"); })注意所有在WEB-INF的页面都会收到保护&#xff0c;因此到达此目录下的页…

Leetcode38. 外观数列

一、题目描述&#xff1a; 给定一个正整数 n &#xff0c;输出外观数列的第 n 项。 「外观数列」是一个整数序列&#xff0c;从数字 1 开始&#xff0c;序列中的每一项都是对前一项的描述。 你可以将其视作是由递归公式定义的数字字符串序列&#xff1a; countAndSay(1) “…

2023年4月份上新的视频领域分割模型设计系列论文(附下载链接)

来源&#xff1a;投稿 作者&#xff1a;王老师 编辑&#xff1a;学姐 论文1 论文标题&#xff1a; Boosting Video Object Segmentation via Space-time Correspondence Learning 论文链接&#xff1a; https://arxiv.org/pdf/2304.06211v1.pdf代码链接&#xff1a;暂未开源 …

PSO算法、MATLAB代码实现以及测试效果

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 PSO算法原理进化操作算法流程图matlab代码实现main函数部分适应度函数部分PSO算法主体测试结果 (F1~F6) PSO算法原理 粒子群优化( Particle Swarm Optimization&am…

Java+GeoTools实现WKT数据根据EPSG编码进行坐标系转换

场景 JavaGeoTools(开源的Java GIS工具包)快速入门-实现读取shp文件并显示&#xff1a; JavaGeoTools(开源的Java GIS工具包)快速入门-实现读取shp文件并显示_霸道流氓气质的博客-CSDN博客 在上面实现Java中集成Geotools之后&#xff0c;需求是将WKT数据转换成其他坐标系的W…

银河麒麟(桌面版和服务器版)之远程桌面安装

一、前言 在信创方案中经常介绍支持麒麟系统&#xff0c;实际上麒麟分为银河麒麟和中标麒麟&#xff0c;银河麒麟又分为服务器版和桌面版&#xff0c;服务器器版一般用于应用系统部署&#xff0c;桌面版一般用于日常办公。银河麒麟操作系统作为国产操作系统&#xff0c;是目前国…

力扣---LeetCode21. 合并两个有序链表(链表经典题)

文章目录 前言21. 合并两个有序链表链接&#xff1a;方法一&#xff1a;取小尾插1.1代码&#xff1a;1.2 流程图&#xff1a;1.3 注意&#xff1a; 方法二&#xff1a;带哨兵位2.1代码&#xff1a;2.2流程图&#xff1a; 总结 前言 焦虑不会消除明天的悲伤 只会让你今天的力量…

openEuler Developer Day 2023成功召开!发布嵌入式商业版本及多项成果

【中国&#xff0c;上海&#xff0c;2023年4月21日】openEuler Developer Day 2023于4月20-21日在线上和线下同步举办。本次大会由开放原子开源基金会指导&#xff0c;中国软件行业协会、openEuler社区、边缘计算产业联盟共同主办&#xff0c;以“万涓汇流&#xff0c;奔涌向前…

QGIS数据可视化学习笔记02——CSV数据和表连接

在其他的GIS软件中&#xff0c;表的连接操作是十分常用的操作&#xff0c;在QGIS中也是一样的&#xff0c;接下来我们介绍QGIS中属性表之间的连接以及如何添加CSV数据到属性表中。 1、表的连接 &emsp如关系型数据库一样&#xff0c;两表连接的前提是&#xff0c;两个表中都…

荔枝派Zero(全志V3S)开启alsa,测试codec

文章目录 前言一、ALSA 简介二、ALSA 框架三、buildroot 配置四、烧录到 SD 卡五、测试1、查看 CODEC 设备2、alsa-utils 使用①、查看设备②、调节音量③、查看控制器④、录音测试⑤、播放测试 前言 默认 dts 中使能了 codec 需要使用的话&#xff0c;在 buildroot 中勾选 a…

Linux离线状态下安装cuda、cudnn、cudatoolkit

目录 1. 下载与安装说明2. CUDA安装3. cuDNN安装4. cudatoolkit安装5. 测试安装成功 1. 下载与安装说明 工具包下载地址 CUDA历史版本下载地址&#xff1a;https://developer.nvidia.com/cuda-toolkit-archivecuDNN历史版本下载地址&#xff1a;https://developer.nvidia.com/r…

pdf怎么删除其中一页?

pdf怎么删除其中一页&#xff1f;大家都应该知道&#xff0c;PDF是一种实用性非常强且非常便携文件格式&#xff0c;许多用户对其非常熟悉。不管是工作还是学习中&#xff0c;都会下载或者使用到pdf文件。pdf文件具有非常好的兼容性&#xff0c;F可以将各种图片、文字内容整合在…

界面开发框架Qt新手入门 - 自定义排序/筛选模型示例(一)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 自定义排序/筛选模型…

记一次某应用虚拟化系统远程代码执行

漏洞简介 微步在线漏洞团队通过“X漏洞奖励计划”获取到瑞友天翼应用虚拟化系统远程代码执行漏洞情报(0day)&#xff0c;攻击者可以通过该漏洞执行任意代码&#xff0c;导致系统被攻击与控制。瑞友天翼应用虚拟化系统是基于服务器计算架构的应用虚拟化平台&#xff0c;它将用户…

原理这就是索引下推呀

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 索引下推是之前面试的时候遇到的一个面试题&#xff0c;当时没有答上来&#xff0c;今天来学习一下。 介绍索引下推之前先看一下MySQL基…

【AI炼丹术】写深度学习代码的一些心得体会

写深度学习代码的一些心得体会 体会1体会2体会3总结内容来源 一般情况下&#xff0c;拿到一批数据之后&#xff0c;首先会根据任务先用领域内经典的Model作为baseline跑通&#xff0c;然后再在这个框架内加入自己设计的Model&#xff0c;微调代码以及修改一些超参数即可。总体流…