小小的串口也能当I2C

FT232R作为一个质量比较好的串口,很多搞嵌入式的手头都会有一个,价格在20元左右,支持BITBANG模式也就意味着可以调试I2C,做这个小东西的想法很久了,把手头的FT232串口发挥到极致。每次一个新的I2C传感器或者摄像头的SCCB想要调试总是太麻烦了,还要先写一个单片机或者拿到树莓派上用i2c-tools。终于熬过期末考试,在家休息两天,做好后拖了几天才开始写博客,主要是写了也没什么人会看,一直再考虑是否要当一个UP主,没有写下去的动力,算是沽名钓誉,也是想的分享一下知识有所肯定。
后续还要扩展EEPROM的支持和SPI FLASH的读取和烧写,以后也会坚持更新。

前情提要

上一篇文章:FT232R(FDTI最常用和廉价的芯片之一)的BITABNG三种模式,即为本篇功能实现基础
源码链接:github:rede97/tinyboard-tools

这份代码已经基本实现了i2c-tools,原本是linux上非常实用的工具可惜windows是没有的,可以扫描I2C总线上的所有设备,读取8bit寄存器的数据,16bit还没有实现,我拿了GY91试验了下,发现是没有问题的,手头也没有更多的I2C模块了。

线路连接

TX->SCLRX<-->SDA,直接连接就可以使用,不需要额外的连接之前想的太复杂了。

那两个10K的上拉电阻没有也是可以用的,毕竟这玩意没有开漏输出,之前还搞了一个肖特基二极管把推完变成了开漏输出,还有模有样4.7Kohm上拉电阻,当了回讲究怪。RX用来控制和读取SDA的电平,BITBANG模式是没有办法中途切换输入输出模式的,所以需要两个引脚并到一起,TX用来发生SCL的时钟,接线就是这个样子。

最终成果

这里只接了GY91,参数0是第0个FTDI设备,0x68MPU9250,0x76是气压计BMP280

PS ~> .\i2cdetect.exe 00  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
70: -- -- -- -- -- -- 76 --

i2cdump用来扫描0x68设备的寄存器,0x75寄存器who am i也就是0x71

PS ~> .\i2cdump.exe 0 0x680  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00: c5 ce e0 0e a0 17 25 cf fa f0 fb fd 00 5a 5b 77
10: bf b9 a5 00 00 00 00 00 00 00 00 00 00 00 00 00
20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
30: 00 00 00 00 00 00 00 00 00 00 01 e3 9c e3 7c cd
40: 6c fa 60 ff 1f 00 3b ff f0 00 00 00 00 00 00 00
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
60: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 1f 89
70: 00 00 00 00 00 71 00 15 fa 00 eb 12 00 22 82 00
80: c5 ce e0 0e a0 17 25 cf fa f0 fb fd 00 5a 5b 77
90: bf b9 a5 00 00 00 00 00 00 00 00 00 00 00 00 00
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
b0: 00 00 00 00 00 00 00 00 00 00 01 e3 9c e3 68 cc
c0: 24 fa 80 ff 15 00 2b ff a0 00 00 00 00 00 00 00
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e0: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 21 22
f0: 00 00 00 00 00 71 00 15 fa 00 eb 12 00 22 82 00

原理

配置FT232环境那一部分就不说了,上一篇文章里安排的明明白白,FT232R插上USB就是干!

芯片的配置

0x03对应0b0011D0(TX-->SCL)D1(RX<-->SDA)为输出。配制成其他管脚也是没有问题的。同步BITBANG模式都是先读取再输出电平,但是一开始配置为读取就只能读取没办法输出电平了。

ftStatus = FT_SetBitMode(handle, 0x03, FT_BITMODE_SYNC_BITBANG);

实际波特率是写进去波特率的6倍,IO的输出速率并不是真的只有9.6kHz。

ftStatus = FT_SetBaudRate(handle, 9600);

清理RX缓冲区,如果之前的程序退出的时候,接收缓冲的数据没有读取完,这次就会被原模原样读出来,不会被清空的。不清空出了bug我可不负责哦~

FT_Purge(handle, FT_PURGE_RX);

下面是扫描0x68地址的ACK信号判断的MPU9250是否存在,可以照着这个思路理解源码的其他部分。这里I2C序列生成的API可以参考ArduinoAPI,基本是一致的。
至于为什么使用序列,需要注意的是,FTDI的驱动将序列发送个FT232芯片输出是需要一段时间的,序列不宜太短,这样会降低通信的效率,必须生成一段足够长的序列,然后读回结果然后判断解析。

uint8_t seq[64] = {0}; //波形序列
uint32_t nbytes;
uint32_t idx = i2c_begin(seq, 0x68); // begin序列
idx += i2c_stop(seq + idx); //stop序列
print_wave(seq, idx, 2); //输出WaveDrom支持的序列格式FT_Write(handle, seq, idx, (LPDWORD)&nbytes);
FT_Read(handle, seq, nbytes, (LPDWORD)&nbytes);
print_wave(seq, idx, 2); //输出最终的响应后的序列结果

看看最终的输出结果吧!

# 生成用于输出的序列
1..0.10.10.10.10.10.10.10.10.10.1
1.0.1.....0..1..0.............10.
# 最终接收到的序列
1..0.10.10.10.10.10.10.10.10.10.1
1.0.1.....0..1..0...........1..0.

如果数字看起来够直观,就把他转换成时序图,这个图是有WaveDrom生成的,SDAO是第一个要输出的序列,SDAI是读入的第二个序列。I2Cbeginstart加上send发送addr|w|acksend后都会跟一个SDA高电平周期,用来接收从机的ACKstop是高电平拉高SDA复位I2C总线,具体参考I2C标准。

start信号是将SDASCL高电平期间拉低。

然后发送地址0x68和写信号0

这里是ack信号和stop信号,可以看出这里两个信号的区别,原本SDAO输出的高电平在ACK周期被拉低,说明这个设备地址在I2C总线上是存在的。stop信号则是SCL高电平器件被拉高,stop信号后的电平是需要多发送一个序列才可以读取到的,实际上没有我补充出来了。

如果有帮助的话支持一下

FTDI BITBANG软件实现i2ctools相关推荐

  1. spidev0.0的正确打开方式

    阅前必读 该平台基于Freescale的主控imx6ull,本人历时两周时间,走过无数坑,原因是无法精确的找到目前使用的文件,主要是nxp命名模式让我有点尴尬,以至于对于错误的spi文件修改了半天,例 ...

  2. 蒂特ft232_[经验分享] 最近调试FT232H遇到的坑

    cnblogs.com Yeats叶子 原创,转载请注明原始地址 - http://www.cnblogs.com/xiedidan/p/ft232h-poc.html Abstract FT232H ...

  3. 用终端访问路由器设置端口开发_Serial for Mac(全功能串行终端管理软件)

    Serial for mac是一个现代化的终端设计,使与服务器,网络设备的工作,并为工程师和系统管理员嵌入式硬件更容易.内置从头开始为OS X,串行不再需要搜索并安装驱动程序,以便与大多数的USB转串 ...

  4. 用终端访问路由器设置端口开发_serial for mac(终端管理软件)v2.0.3

    原标题:serial for mac(终端管理软件)v2.0.3 serial for mac是应用在Mac上的一款终端管理软件,可以帮助您连接和控制串行设备,如服务器,路由器或调制解调器等网络设备, ...

  5. stm32烧录软件_stm32怎么烧录程序

    STM32烧录程序目前笔者知道的有三种:JLink ,Ulink和串口烧录,使用工具分别为:JLink,ULink以及USB转TTL线. ULink 烧录程序 在安装MDK过程中,会有提示是否安装驱动 ...

  6. FTDI(FT220XQ)(一)——USB转SPI芯片的使用之驱动安装及设备信息配置

    目录 1. 概述 2. PC端驱动安装 2.1 查看驱动是否已经自动安装 2.1 驱动类型 2.2 安装(WIN10 64位) 1. 概述 FTDI公司全称是Future Technology Dev ...

  7. linux上使用ftdi的串口芯片,D2XX for Linux,出现ftdi d2xx与linux上的ftdi_sio冲突问题

    智科创玩 写在前面 1.问题概述 2.解决方法 2.1 查看VCP串口信息 2.2 查看驱动信息 写在前面 声明:笔者使用的ARM平台是orangepi4平台,Ubuntu,aarch64,D2XX ...

  8. 近期FTDI的FT232RL杀疯了,给大家介绍一款国产替代P TO P的高性能GR232RL

    GP232r 是最新加入 ftdi 系列 usb 接口集成电路设备的设备. GP232r 是一个 usb 到串行 uart 接口,带有可选的时钟发生器输出,以及新的 ftdichip-idTM 安全加 ...

  9. FTDI 234XD USB转串口 PC识别串口固定的解决方法

    生产和测试反馈,调试多个设备的时候,总是要安装驱动,识别的设备的串口总是在变.今天抽空去官网(https://www.ftdichip.cn/FTFirmware.htm)上了解了一下,有两种解决方案 ...

最新文章

  1. 2016政策与市场协同发力大数据,小公司如何搏杀BAT?
  2. 使用C#实现网站用户登录 (转)
  3. 找出占用磁盘空间最大的前10个文件或文件夹
  4. 查看Linux声卡基本信息[转载]
  5. 字节跳动AI副总裁离职,将加入清华大学张亚勤团队
  6. microdot - 一个开源 .NET 微服务框架。
  7. xlsx文件打开乱码_Excel 2016 双击无法打开xlsx文件怎么办?
  8. 自定义刻度_想为 Apple Watch 打造自定义表盘,试试这款 App
  9. 可穿戴设备的主流传感器介绍
  10. kali Linux下wifi密码安全测试(1)虚拟机下usb无线网卡的挂载 【转】
  11. 通俗易懂!视觉slam第七部分——四元数
  12. java执行脚本命令(shell脚本或cmd脚本)
  13. 计算机信息规划工资,2020年工科类专业薪资最新排名,计算机很吃香,工资水平最高...
  14. 线性同余法的伪随机数
  15. 嵩天《Python网络爬虫与信息提取》实例1:Requests库网络爬虫实战5个实例
  16. eeepc linux 软件管理,Linux_为EeePC增添活力 EeePC安装Ubuntu预览,虽然Eee PC运行基于Xandros的Linux - phpStudy...
  17. Java基础——使用json所要用到的jar包下载
  18. 电商中的订单号如何实现
  19. 华为企业云如何让 DevOps 真正落地?
  20. CAD 查找指定部件数量

热门文章

  1. 小议并实战go包------顺便说说go中的GOROOT,GOPATH和src,pkg,bin
  2. 定期存款利息计算器(作业)
  3. 什么是 ELT 和 ETL?
  4. 【PB】程序中在普通激光打印机上实现条码打印
  5. 抗疫得闲●流花湖(1)
  6. 计算机编程飞船,信息学奥赛题库- 太空飞船
  7. oracle查询job运行状态,查询当前正在执行的job的情况
  8. 时隔3年,再次折腾BlackBerry 8830!
  9. js中的Boolean
  10. python-list、tuple