libftdi1学习笔记 3 - MPSSE GPIO

目录

1. 设置模式

2. gpio状态

3. 初始化gpio状态

4. 写gpio

5. 读gpio

6. 验证

6.1 初始化gpio

6.2 测试代码


MPSSE,即Multi-Protocol Synchronous Serial Engine,是FTDI公司推出的一种多协议同步串行引擎,目前仅FT232H、FT2232H、FT4232H(A)支持。

FT232H支持1路MPSSE,GPIO口是ADBUS0-ADBUS7、ACBUS0-ACBUS7,一共16个GPIO(注意ACBUS8,ACBUS9不可控)。

FT2232H支持2路MPSSE,第1路MPSSE(Interface A)控制的GPIO口是ADBUS0-ADBUS7、ACBUS0-ACBUS7,第2路MPSSE(Interface B)控制的GPIO口是BDBUS0-BDBUS7、BCBUS0-BCBUS7。一共16x2个GPIO。

FT4232H也支持2路MPSSE,第1路MPSSE(Interface A)控制的GPIO口是ADBUS0-ADBUS7,第2路MPSSE(Interface B)控制的GPIO口是BDBUS0-BDBUS7。一共8x2个GPIO。

在main.c中添加exMpsseGPIO函数。

int exMpsseGPIO(struct ftdi_context *ftdi)
{return 0;
}

在打开设备成功后面添加:

    if(exMpsseGPIO(ftdi) != 0){ftdi_usb_close(ftdi);ftdi_list_free(&devlist);ftdi_free(ftdi);return EXIT_FAILURE;}

1. 设置模式

一般FTDI设备是默认串口的模式,需要通过ftdi_set_bitmode设置为MPSSE模式。

int ftdi_set_bitmode(struct ftdi_context *ftdi, unsigned char bitmask, unsigned char mode)

参数说明:

  • ftdi - 上下文对象,即ftdi_new的返回值。
  • bitmask - 这个参数用于bitbang模式读写CBUS脚,设置模式可以设为0
  • mode - 模式
enum ftdi_mpsse_mode
{BITMODE_RESET  = 0x00,    /**< switch off bitbang mode, back to regular serial/FIFO */BITMODE_BITBANG= 0x01,    /**< classical asynchronous bitbang mode, introduced with B-type chips */BITMODE_MPSSE  = 0x02,    /**< MPSSE mode, available on 2232x chips */BITMODE_SYNCBB = 0x04,    /**< synchronous bitbang mode, available on 2232x and R-type chips  */BITMODE_MCU    = 0x08,    /**< MCU Host Bus Emulation mode, available on 2232x chips *//* CPU-style fifo mode gets set via EEPROM */BITMODE_OPTO   = 0x10,    /**< Fast Opto-Isolated Serial Interface Mode, available on 2232x chips  */BITMODE_CBUS   = 0x20,    /**< Bitbang on CBUS pins of R-type chips, configure in EEPROM before */BITMODE_SYNCFF = 0x40,    /**< Single Channel Synchronous FIFO mode, available on 2232H chips */BITMODE_FT1284 = 0x80,    /**< FT1284 mode, available on 232H chips */
};

参考例程:

    ret = ftdi_set_bitmode(ftdi, 0, BITMODE_MPSSE);if(ret < 0){printf("Set Mode Fail: %d\n", ret);return EXIT_FAILURE;}

2. gpio状态

gpio的方向和一般的设定相反,0表示输入,1表示输出。

typedef enum
{GPIO_DIR_IN = 0,GPIO_DIR_OUT = 1,
}gpio_dir_e;

电平设定一样,0表示低电平,1表示高电平。

typedef enum
{GPIO_LEVEL_L = 0,GPIO_LEVEL_H = 1,
}gpio_level_e;

将16个GPIO的方向和电平定义如下:

typedef struct 
{struct ftdi_context *ftdi;uint16_t dir;uint16_t level;
}mpsse_gpio_s;

对GPIO的操作都记录在全局变量中

mpsse_gpio_s gpio;

3. 初始化gpio状态

初始化变量gpio

void mpsseGpioInit(mpsse_gpio_s init)
{uint8_t cmd[6];gpio = init;cmd[0] = 0x80;cmd[1] = (uint8_t)(gpio.level & 0xff);cmd[2] = (uint8_t)(gpio.dir & 0xff);cmd[3] = 0x82;cmd[4] = (uint8_t)((gpio.level >> 8) & 0xff);cmd[5] = (uint8_t)((gpio.dir >> 8) & 0xff);ftdi_write_data(gpio.ftdi, cmd, sizeof(cmd));
}

命令0x80 + level + dir:三个字节命令,0x80命令字表示写xDBUS0~xDBUS7(x表示A或B)。

命令0x82 + level + dir:三个字节命令,0x82命令字表示写xCBUS0~xCBUS7(x表示A或B)。

4. 写gpio

void mpsseGpioWrite(uint8_t io, gpio_level_e level)
{uint8_t cmd[3];if(io > 15)return;gpio.level &= ~(1 << io);gpio.level |= (level << io);gpio.dir &= ~(1 << io);gpio.dir |= (GPIO_DIR_OUT << io);if(io > 7){cmd[0] = 0x82;cmd[1] = (uint8_t)((gpio.level >> 8) & 0xff);cmd[2] = (uint8_t)((gpio.dir >> 8) & 0xff);}else{cmd[0] = 0x80;cmd[1] = (uint8_t)(gpio.level & 0xff);cmd[2] = (uint8_t)(gpio.dir & 0xff);}ftdi_write_data(gpio.ftdi, cmd, sizeof(cmd));
}

参数说明:

io - 对应GPIO输出

level - 输出电平,高电平或低电平

5. 读gpio

先写命令0x81或0x83通知FTx232H读入IO状态,然后直接读1个字节回来(即8个IO的状态都读回来了)

int mpsseGpioRead(uint8_t io, gpio_level_e *plevel)
{uint8_t cmd[1];if(io > 15)return -1;if(io > 7){cmd[0] = 0x83;}else{cmd[0] = 0x81;}ftdi_write_data(gpio.ftdi, cmd, sizeof(cmd));int ret = ftdi_read_data(gpio.ftdi, cmd, 1);if(ret < 0)return -1;if((cmd[0] & (1 << (io % 8))) > 0)*plevel = GPIO_LEVEL_H;else*plevel = GPIO_LEVEL_L;gpio.level &= ~(1 << io);gpio.level |= (*plevel << io);return 0;
}

6. 验证

将FT4232H的模块中ADBUS0和ADBUS1短路,ADBUS0输出,同时ADBUS1读入。首先需要打开设备和设置模式为MPSSE。

6.1 初始化gpio

将ADBUS0设置为输出,ADBUS1设置为输入,其他GPIO都设置为输入。

    mpsse_gpio_s gpioInit;gpioInit.ftdi = ftdi;gpioInit.dir = 0x0000; //All inputgpioInit.dir |= (GPIO_DIR_OUT << 0);    //ADBUS0 output, ADBUS1 inputgpioInit.level = 0x0000;mpsseGpioInit(gpioInit);

6.2 测试代码

    unsigned char wrData[] = "GPIO Data\n";unsigned char rdData[128];for(int i = 0; i < (int)sizeof(wrData); i++){uint8_t level = wrData[i];printf("%2x ", level);gpio_level_e read;rdData[i] = 0;for(int j = 0; j < 8; j++){mpsseGpioWrite(0, level & 0x01);level >>= 1;mpsseGpioRead(0, &read);rdData[i] |= read << j;}printf("= %2x\n", rdData[i]);}rdData[sizeof(wrData) + 1] = 0;printf("\nGPIO Read : %s\n", rdData);

在ADBUS0输出字符串“GPIO Data\n”,然后看ADBUS1脚输入是不是也是一样。验证结果:

/libftdi-example$ sudo ./libftdi1-example 
version:1.5.0, 1.5
Number of FTDI devices found: 1
Manufacturer: FTDI, Description: FT4232H MiniModule, Serial: FT8NZV77Open device OK: 0
47 = 47
50 = 50
49 = 49
4f = 4f
20 = 20
44 = 44
61 = 61
74 = 74
61 = 61a =  a0 =  0GPIO Read : GPIO Data

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

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

相关文章

网络管理实验二、SNMP服务与常用的网管命令

1 常用的网管命令 1.1 网络状态监视命令 包括以下命令&#xff1a;Ipconfig、ping、nslookup、dig、host ipconfig 作用&#xff1a;用来显示本机所有网卡的基本信息&#xff08;IP、掩码、网关、工作状态&#xff09;&#xff1b;用法&#xff1a;ipconfig展示&#xff1a;…

ExtendSim花生酱加工厂模型

该模型展示了ExtendSim可靠性模块与ExtendeSim离散速率技术相结合的协同作用。 在花生酱加工厂的最初阶段&#xff0c;花生经过烘烤和冷却。冷却后的花生经过热烫或水烫去外皮。这些经过漂白的花生进入过程的混合部分&#xff0c;在研磨机中用盐、葡萄糖和氢化油稳定剂将其粉碎…

如何通过Linux pciehp sysfs接口控制PCIe Slot电源状态?-3

pciehp sysfs接口电源控制与NVME驱动卸载的区别 从NVMe SSD设计本身而言&#xff0c;当通过pciehp sysfs接口对PCIe插槽执行Power Off操作时&#xff0c;由于NVMe SSD作为PCIe设备&#xff0c;其电源供应是直接依赖于所连接的PCIe插槽提供的。当插槽电源被关闭时&#xff0c;会…

死锁检测组件

一、死锁 线程 A 占用资源 1,线程 B 占用资源 2,线程 A 想占用资源 2,线程 B 想占用资源 1,线程 A 占用资源 1 的情况下去申请占用资源 2,线程 B 占用资源 2 的情况下去申请占用资源 1,就会出现互相等待对方释放资源的情况,也就是死锁。 CPU 占用率 100% → 出现死循环或…

国产HMI芯片Model3C ——工业品质价格亲民

工业级芯片相较于消费级芯片&#xff0c;在性能上确实拥有显著的优势&#xff0c;尤其对于带彩屏显示或HMI的产品来说&#xff0c;这种优势表现得尤为突出。 首先&#xff0c;对于带彩屏显示或HMI人机交互的产品来说&#xff0c;高性能的芯片是保证流畅的用户体验和快速响应的…

阿里云对象存储OSS批量上传,单个上传,批量删除,单个删除!

请自行替换秘钥&#xff1a; #阿里云 OSS src/main/resources/application.properties #不同的服务器&#xff0c;地址不同 aliyun.oss.file.endpointhttps://oss-cn-hangzhou.aliyuncs.com aliyun.oss.file.accessKeyIdLTAI5t9wUqCoD42qPGRy8S aliyun.oss.file.accessKeySecre…

Spring中的适配器模式

在Spring MVC框架中&#xff0c;适配器模式主要体现在对不同类型的处理器&#xff08;即Controller&#xff09;的统一处理上。Spring MVC通过适配器模式来保证无论Controller的实现方式如何多样化&#xff0c;都能够被DispatcherServlet统一调用和管理。具体使用方式如下&…

如何AI绘画(动漫风格)

绘画描述&#xff1a;一只金毛犬 绘画结果&#xff1a; 如何AI绘画&#xff08;动漫风格&#xff09;&#xff1a; 关注一休哥助手微信公众号 点击小程序按钮打开一休哥助手小程序 切换到我&#xff0c;复制授权码 登录网站&#xff1a;https://www.fudai.fun/drawing&…

leetcode.45题:跳跃游戏II

Leetcode.45题&#xff1a;跳跃游戏II /* 题意的理解&#xff1a; nums[0] 只能跳 1 ~ nums[0]步 依次类推&#xff1a;从nums[0] - nums[n - 1] 最少需要多少步数 nums 2 3 1 1 4 nums[0] 2,初始只能跳 1/2步&#xff0c;如跳1步&#xff0c;达到nums[1] 而nums[1] 3,顾第二…

C++构造析构函数

说起默认成员函数&#xff0c;每一个C程序员都不会陌生&#xff0c;因为默认成员函数就如同是一栋大厦的地基。我们常说“基础不牢&#xff0c;地动山摇”&#xff0c;在这里得到充分的体现。本章介绍两种默认成员函数&#xff1a;构造函数和析构函数。 正文开始~~~ 构造函数 …

解决 Linux环境下 conda环境无法激活

文章目录 Linux环境下 conda环境无法激活 Linux环境下 conda环境无法激活 检查’.bashrc’ 文件 vim ~./.bashrc add export PATH"/home/[usr_name]/[miniconda3 or anacodna]/bin:$PATH" # commented out by conda initialize conda init 重启shell 重新尝试con…

网络篇01 | 入门篇

网络篇01 | 入门篇 01 各层协议目录[网络篇02 | 应用层 kcp&#xff08;王者荣耀&#xff09;](https://blog.csdn.net/qiushily2030/article/details/135835946)[网络篇03 | 应用层 quic](https://blog.csdn.net/qiushily2030/article/details/136192481)[网络篇04 | 应用层 m…

Stable Diffusion之文生图模型训练

1、数据准备 提前准备好一组相关的照片。 在线的图片处理网站 BIRME - Bulk Image Resizing Made Easy 2.0 (Online & Free) 将图片转成统一大小&#xff0c;支持批量处理&#xff0c;效率高 2、生成提示词 进入stable diffusion webui页面 旧版直接使用 train/proproc…

如何给自己的网站添加 https ssl 证书

文章目录 一、简介二、申请 ssl 证书三、下载 ssl 证书四、配置 nginx五、开放 443 端口六、常见问题解决(一)、配置后&#xff0c;访问 https 无法连接成功(二) 证书配置成功&#xff0c;但是访问 https 还是报不安全 总结参考资料 一、简介 相信大家都知道 https 是更加安全…

医院一站式后勤管理系统 processApkUpload.upload 任意文件上传漏洞复现

0x01 产品简介 医院一站式后勤管理系统由南京博纳睿通软件科技有限公司开发的一款基于现代医院后勤管理理念的业务系统,产品结合后勤业务管理特点,通过管理平台将后勤管理业务予以系统化、规范化和流程化,从而形成一套构建于平台之上且成熟完善的后勤管理体系,并可在此体系…

使用阿里云试用Elasticsearch学习:Search Labs Tutorials 搭建一个flask搜索应用

文档&#xff1a;https://www.elastic.co/search-labs/tutorials/search-tutorial https://github.com/elastic/elasticsearch-labs/tree/main/example-apps/search-tutorial Full-Text Search

Excel报表成果展示

采用Excel函数实现数据的快速计算&#xff0c;如下&#xff0c;看似很复杂&#xff0c;实际非常方便。

文献速递:深度学习肝脏肿瘤诊断---基于深度学习的肝细胞结节性病变在整片组织病理图像上的分类

Title 题目 Deep Learning-Based Classification of Hepatocellular Nodular Lesions on Whole-Slide Histopathologic Images 基于深度学习的肝细胞结节性病变在整片组织病理图像上的分类 Background 背景 Hepatocellular nodular lesions (HNLs) constitute a heterogen…

大模型拥有的数万亿个参数,这个指标如何理解

数万亿个参数这个指标是描述大型人工智能模型复杂度的一个方式。在这个上下文中&#xff0c;一个“参数”可以理解为模型中的一个配置或设置&#xff0c;它决定了模型在处理数据时的行为。这些参数在模型的训练过程中被调整和优化&#xff0c;以便模型能够更好地完成特定任务&a…

理解vuecli和nginx启动Vue项目区别

Vue CLI 和 Nginx 在启动 Vue 项目时各自扮演着不同的角色&#xff0c;它们之间存在一些关键的区别。以下是关于这两者的主要差异&#xff1a; 1.开发环境与部署环境&#xff1a; Vue CLI&#xff1a;Vue CLI 是一个基于 Node.js 的开发工具&#xff0c;主要用于在本地开发环…