精华内容
下载资源
问答
  • 串口/I2C调试工具

    2014-01-13 14:26:56
    很好用的串口通信软件,小而强大, 还有I2C调试功能
  • I2C读写串口与pc显示

    2018-09-19 20:06:17
    介绍I2C的工作原理,详细讲解了I2C读写串口的原理并在pc上显示
  • 串口 i2c

    千次阅读 2017-10-13 10:44:55
    i2cdetect -y -a 1 将树莓派3的硬件串口与mini串口默认映射对换 树莓派可以配置文件来修改设备树,我的理解是可以通过配置文件来修改管脚的映射关系,这在许多Cortex-M3内核的单片机中也很常见,可以将同一个...

    i2cdetect -y -a 1

    首先在raspi-config 关闭串口调试

    将树莓派3的硬件串口与mini串口默认映射对换

    树莓派可以配置文件来修改设备树,我的理解是可以通过配置文件来修改管脚的映射关系,这在许多Cortex-M3内核的单片机中也很常见,可以将同一个串口映射到不同的管脚上,以方便PCB的布线。

    为了在树莓派3中通过GPIO使用高性能的硬件串口,我们必须将分配给蓝牙使用的硬件串口与分配给IO排针的mini串口进行对换,这必然会使得蓝牙模块的功能受到影响,但还好,蓝牙并不是必须的。

    在树莓派系统中

    1
    
    /boot/overlays/
    

    目录下,提供了一个pi3-miniuart-bt-overlay.dtb的文件,这个文件的作用可以通过该目录下的README文件查看

    QQ截图20170129153256

    QQ截图20170129153541

    README文件中说明了这个文件的功能是将树莓派3的蓝牙切换到mini串口(ttyS0),并且恢复硬件串口(ttyAMA0)到GPIO 14&15脚中。并且给出了载入的方法。

    首先在树莓派命令终端中通过命令查看树莓派3当前的串口映射关系

    1
    
    ls -l /dev
    

    QQ截图20170129151839

    红色框中体现的应该是一种映射关系,此处暂时没有做深究,简单理解 serial0 就是GPIO映射的串口,此时GPIO映射的串口是默认的/dev/ttyS0这个mini串口。

    使用下面这条指令编辑 /boot/config.txt 文件

    1
    
    sudo nano /boot/config.txt
    

    在该文件中增加一行代码

    1
    
    dtoverlay=pi3-miniuart-bt
    

    然后保存文件,重启树莓派使之生效。

    再通过 ls -l /dev 命令查看修改后的映射关系

    QQ截图20170129154121

    对比修改前的关系,可以看出serial0和serial1 与 ttyAMA0和ttyS0的映射关系对换完成了,也就是ttyAMA0映射到了引出的GPIO Tx Rx上。

    禁用串口的控制台功能

    前面的步骤已经交换了硬件串口与mini串口的映射关系,但现在想使用树莓派外接串口模块进行通信还不行,因为树莓派IO引出的串口默认是用来做控制台使用的,它的初衷是为了在没有网络接口时,通过串口对树莓派进行相关的配置。因此需要禁用这个默认功能,使得串口为我们自由使用。

    在树莓派命令窗口中分别通过如下两个命令停止和禁用串口的控制台功能

    1
    2
    
    sudo systemctl stop serial-getty@ttyAMA0.service
    sudo systemctl disable serial-getty@ttyAMA0.service
    

    由于我们前面已经交换了串口的映射关系,因此这里注意是ttyAMA0。

    然后通过下列指令编辑cmdline.txt文件

    1
    
    sudo nano /boot/cmdline.txt
    

    然后看到里面类似如下的内容

    1
    
    dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
    

    把console=serial0,115200删掉 console=serial0,115200 ,剩下的内容类似如下

    1
    
    dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
    

    然后重新启动树莓派,使修改生效


    展开全文
  • 通过RS232来模拟读写I2C器件,可以用来做写卡线
  • I2C串口通信

    千次阅读 2017-12-07 21:48:57
    I2C通信是一种同步串行通信方式,它有两根双向信号线。一根是数据线SDA(serial data I/O),另一根是时钟线SCL(serial clock)。IIC总线上可以挂多个器件,而每个器件都有唯一的地址,这样可以标识通信目标。数据...

    I2C通信是一种同步串行通信方式,它有两根双向信号线。一根是数据线SDA(serial data I/O),另一根是时钟线SCL(serial clock)。IIC总线上可以挂多个器件,而每个器件都有唯一的地址,这样可以标识通信目标。数据的通信的方式采用主从方式,主机负责主动联系从机,而从机则被动回应数据。

    总线电路结构
    I2C总线通过上拉电阻接正电源。当总线空闲时,两根线均为高电平。连到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA及SCL都是线“与”关系。

    I2C总线传输协议内容
    1,数据位的有效性规定:SCL为高电平期间,数据线上的数据必须保持稳定,只有SCL信号为低电平期间,SDA状态才允许变化。(可以理解为,要读取信号的时候,SCL必须为高电平,要写入信号的时候,SCL为低电平,软件编程实现该协议的时候需要注意这一点)
    2,起始和终止信号的形式约定
    SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。
    由于起始和终止信号都不属于数据位,故不用遵循数据位有效性规定。
    3,I2C字节的传送与应答
    每一个字节必须保证是8位长度。数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)。

    应答位的作用
    1,主机在发送数据时,每次发送一字节数据,都需要读取从机应答位,当从机空闲可以接收该字节数据时,从机会发出应答(一帧数据的第9位为“0”),当从机正忙于其他工作的处理来不及接收主机发送的数据时,从机会发出非应答(一帧数据的第9位为“1”)主机则应发出终止信号以结束数据的继续传送,主机通过从机发出的应答位来判断从机是否成功接收数据。
    2,当主机接收数据时,它收到最后一个数据字节后,必须向从机发出一个结束传送的信号。这个信号是对从机发送“非应答”,即在最后一帧的第9位置1。然后,从机释放SDA线,以允许主机产生终止信号。

    I2C读写数据流程
    I2C写数据流程
    这里写图片描述
    在起始信号后必须传送一个从机的地址(7位),单片机开发板上的AT24C02地址为0xa0,第8位是数据的传送方向位(R/T),用“0”表示主机发送数据(T),“1”表示主机接收数据(R)。
    I2C读数据流程
    这里写图片描述
    在读数据时也要先发送器件地址,读写方向为写,因为我们下一帧需要发送从AT24C02内哪个单元开始读,所以需要发送一帧读取的首地址。之后需在发一次器件地址这个时候读写方向就为读了,接着我们就可以从总线上读取数据。
    PS:上述图片中灰色部分为主机发送内容,白色部分为从机发送内容,S表示起始信号,A表示应答,A横杠表示非应答,P表示终止信号

    I2C总线的各种信号的持续时间的要求:
    这里写图片描述

    nop()函数的作用:延迟一个机器周期,经常被用于让信号传输稳定一段时间

    软件编程实现I2C通信的时候,只要SDA赋值操作,前面必须有SCL置零的操作(起始信号和终止信号除外),可以理解为只有SCL为高电平时,SDA线上的数据信号才是有效的;SCL为低电平时,SDA线的数据信号是无效的。

    不论主机是发送数据还是接收数据,SCL(时钟总线)始终是由主机控制的,即便是主机读取数据,也可以控制读取数据的时间节奏。

    在软件实现I2C通信的时候,每次基本操作结束之后,必须将SCL线拉低,因为如果之后是从机发送信号(应答信号或者数据信号),若此时SCL线是高电平,从机并没有权限修改SCL线的电平,则它无法改变SDA线的值(参照之前提到的数据位有效性规定)。
    操作结束之后,最好将SDA线拉高来表示数据总线被释放。

    展开全文
  • 本程序基于串口扩展芯片WK2204.实现了i2c转4个串口。本源程序在为开微电子的网站也有。
  • 本适配器为多功能合一产品,涉及接口有SPI接口,I2C接口,UART接口,I2C与 UART接口,异步串口预留接口,打印并口
  • GD32F130通过I2C读取LIS3DH三轴数据再成角度数据完整工程 完整工程,下载下来用KEIL5就能打开工程直接编译 初始化串口 初始化I2C接口 先初始化LIS3DH三轴传感器 开启看门狗 在主循环喂狗 读取三轴原始数据 把三轴...
  • 刚好过完年到现在没有写博客, 贴点很久以前的东西骗点...类似于Arduino Uno, 只有一个串口的Arduino板子, 并不妨碍我们读取TFmini的数据, 只需要连接TFmini的TX到Arduino的RX即可, 不影响Arduino的TX向PC发数据, ...

    刚好过完年到现在没有写博客, 贴点很久以前的东西骗点阅读量…

    TFmini是北醒光子的一款Lidar, 卖的很不错.

    TFmini_Arduino_HardwareSerial_Polling

    类似于Arduino Uno, 只有一个串口的Arduino板子, 并不妨碍我们读取TFmini的数据, 只需要连接TFmini的TX到Arduino的RX即可, 不影响Arduino的TX向PC发数据, 连接方式如下:

    在这里插入图片描述

    TFminiArduino
    5V(红)5V
    GND(黑)GND
    TX(绿)0(RX)

    采用轮询的方式, 代码如下:

    void getTFminiData(int* distance, int* strength) {
      static char i = 0;
      char j = 0;
      int checksum = 0; 
      static int rx[9];
      if(Serial.available()) {  
        rx[i] = Serial.read();
        if(rx[0] != 0x59) {
          i = 0;
        } else if(i == 1 && rx[1] != 0x59) {
          i = 0;
        } else if(i == 8) {
          for(j = 0; j < 8; j++) {
            checksum += rx[j];
          }
          if(rx[8] == (checksum % 256)) {
            *distance = rx[2] + rx[3] * 256;
            *strength = rx[4] + rx[5] * 256;
          }
          i = 0;
        } else {
          i++;
        } 
      }  
    }
    
    void setup() {
      Serial.begin(115200);
    }
    
    void loop() {
      int distance = 0;
      int strength = 0;
    
      getTFminiData(&distance, &strength);
      while(!distance) {
        getTFminiData(&distance, &strength);
        if(distance) {
          Serial.print(distance);
          Serial.print("cm\t");
          Serial.print("strength: ");
          Serial.println(strength);
        }
      }
    }
    

    注意下载程序的时候, 拔掉TFmini的TX, 下完程序后再插到Arduino的0(RX)上.


    TFmini_Arduino_HardwareSerial_Interrupt

    连接方式同上, 我们在串口事件中接收, 接收完成后, 在loop()中打印:

    int distance = 0;
    int strength = 0;
    boolean receiveComplete = false;
    
    void getTFminiData(int* distance, int* strength, boolean* complete) {
      static char i = 0;
      char j = 0;
      int checksum = 0; 
      static int rx[9];
      if(Serial.available()) {  
        rx[i] = Serial.read();
        if(rx[0] != 0x59) {
          i = 0;
        } else if(i == 1 && rx[1] != 0x59) {
          i = 0;
        } else if(i == 8) {
          for(j = 0; j < 8; j++) {
            checksum += rx[j];
          }
          if(rx[8] == (checksum % 256)) {
            *distance = rx[2] + rx[3] * 256;
            *strength = rx[4] + rx[5] * 256;
            *complete = true;
          }
          i = 0;
        } else {
          i++;
        } 
      }  
    }
    
    void setup() {
      Serial.begin(115200);
    }
    
    void loop() {
      if(receiveComplete) {
        receiveComplete = false;
        Serial.print(distance);
        Serial.print("cm\t");
        Serial.print("strength: ");
        Serial.println(strength);
      }
    }
    
    void serialEvent() {
      getTFminiData(&distance, &strength, &receiveComplete);
    }
    

    注意下载程序的时候, 拔掉TFmini的TX, 下完程序后再插到Arduino的0(RX)上.

    TFmini_Arduino_SoftwareSerial

    使用软件串口库, 来模拟一个串口. 连接方式如下:

    在这里插入图片描述

    代码参考 TFmini_Arduino_SoftwareSerial.

    下载程序, 运行即可.


    TFmini_Arduino_SoftwareSerial_Multiple

    listen轮询软件串口的方法, 连接多个TFmini, 只需要接TFmini的TX即可, RX悬空, 理论上几乎未被占用的数字IO每个都可以接一个TFmini.

    在这里插入图片描述

    代码参考 TFmini_Arduino_SoftwareSerial_Multiple.


    TFmini_Arduino_SoftwareSerial_Multiple_Frequency

    listen轮询软件串口的方法, 连接多个TFmini, 只需要接TFmini的TX即可, RX悬空, 理论上几乎未被占用的数字IO每个都可以接一个TFmini. 对上面的代码优化, 封装, 并且加上测试频率:

    #include <SoftwareSerial.h>  
    
    typedef struct {
      int distance;
      int strength;
      boolean receiveComplete;
    }TFmini;
    
    TFmini TFminiOne = {0, 0, false};
    TFmini TFminiTwo = {0, 0, false};
    
    //SoftwareSerial port(TX, RX);
    SoftwareSerial portOne(2, 2);
    SoftwareSerial portTwo(3, 3); 
    
    void getTFminiData(SoftwareSerial* port, TFmini* tfmini) {
      port->listen();
      while(tfmini->receiveComplete == false) 
      {   
        static char i = 0;
        char j = 0;
        int checksum = 0; 
        static int rx[9];
        if(port->available()) {  
          rx[i] = port->read();
          if(rx[0] != 0x59) {
            i = 0;
          } else if(i == 1 && rx[1] != 0x59) {
            i = 0;
          } else if(i == 8) {
            for(j = 0; j < 8; j++) {
              checksum += rx[j];
            }
            if(rx[8] == (checksum % 256)) {
              tfmini->distance = rx[2] + rx[3] * 256;
              tfmini->strength = rx[4] + rx[5] * 256;
              tfmini->receiveComplete = true;
            }
            i = 0;
          } else {
            i++;
          } 
        } 
      } 
    }
    
    void setup() {
      Serial.begin(115200);
      portOne.begin(115200);
      portTwo.begin(115200);
    }
    
    void loop() {
        static unsigned long lastTime = millis();
        static unsigned int count = 0;
        static unsigned int frequency = 0;
        
        getTFminiData(&portOne, &TFminiOne);
        getTFminiData(&portTwo, &TFminiTwo);
        
        if(TFminiOne.receiveComplete == true && TFminiTwo.receiveComplete == true) {
          ++count;
    
          if(millis() - lastTime > 999) {
            lastTime = millis();
            frequency = count;
            count = 0;
          }   
        
          Serial.print(TFminiOne.distance);
          Serial.print("cm\t");
          Serial.print("strength1: ");
          Serial.print(TFminiOne.strength);
          Serial.print("\t");
        
          Serial.print(TFminiTwo.distance);
          Serial.print("cm\t");
          Serial.print("strength2: ");
          Serial.print(TFminiTwo.strength);
          Serial.print("\t");
    
          Serial.print(frequency);  //40~70Hz, It maybe higher if we don't print other thing. 
          Serial.println("Hz");
          
          TFminiOne.receiveComplete = false;
          TFminiTwo.receiveComplete = false;
        }
    
     }
    
    

    结果如下:
    在这里插入图片描述

    TFmini_Arduino_I2C_1Master1Slave

    从设备Arduino Uno 的RX连接一个TFmini, 读取的数据通过TX传送到电脑上 并且 通过I2C(SCL和SDA引脚)发送出去. 主设备Arduino通过I2C(SCL SDA引脚)接收从设备传来的数据, 然后把数据通过串口传输到电脑. 连接方式如下:

    在这里插入图片描述

    代码参考 TFmini_Arduino_I2C_1Master1Slave, 其中, Slave程序下载给Arduino Uno, 注意下载程序的时候拔掉TFmini的绿线, 下完程序后再插到Uno的RX上. Master程序下载到Arduino Due中.

    读取的数据如下图:

    在这里插入图片描述

    左边是TFmini的100Hz数据, 右边是Due通过I2C读到的数据. 可以看到Due读取的有重复的数据, 可以稍微修改下程序, 使用millis()或者软件定时器把查询的频率也设成100Hz. 同样也可看出没有其它代码时, 如果保证不丢数据, I2C接4个TFmini比较合适, 超过4个可能造成频率有一定程度的下降.

    Github项目地址

    https://github.com/TFmini/TFmini-Arduino

    展开全文
  • USB转I2C USB转I2C模块

    万次阅读 2018-06-12 16:50:18
    学习单片机的过程中,会接触各种各样的通信协议,类似串口、iic、spi、can等。... 下面推荐一块usbiic的模块,同时也支持usb串口。所以针对学习单片机的同学来说是非常好的工具了: 点击打开链接 ...
  • 参考别程序,利用STM8L051F3 串口通讯,模拟I2C读写MPU6050,程序实验可用,读出来数据正确
  • USB线上/串口/I2C引脚串联电阻的作用

    千次阅读 2019-02-18 16:03:37
    一个串口通讯的提示信号,当接上串口时,因为瞬间的插拔产生了一个很窄的电压脉冲,如果这个脉冲直接打到GPIO口,很可能打坏芯片,但是串了一个小电阻,很容易把能力给消耗掉。 如果脉冲是5mA 5.1V,那么过了30ohm后...
  • STC89C52的I2C串口通信 I2C总线 单片机电路中的I2C总线(Inter Integrated Circuit Bus)是一种Philips公司推行的串行总线标准。连接在总线上的外设通过总线寻址,是具有总线仲裁和高低速设备同步等功能的高性能多...
  • 名称:纬图Ginkgo USB-I2C适配器品牌:ViewTool/纬图型号:VTG200A 典型应用:- I2C总线设备,芯片控制、调试 - I2C接口传感器测试 - I2C存储器EEPROM数据读写 - I2C总线设备故障检测维修 - PMBus和SMBus总线接口...
  • 学习 I2C 总线通信协议,使用 STM32F103 完成基于 I2C 协议的 AHT20 温湿度传感器的数据采集,并将采集的温度、湿度值通过串口输出。具体任务: 解释什么是“软件 I2C”和“硬件 I2C”? (阅读野火配套教材的第 23...
  • 固件#01--USB转I2C底层代码和原理

    千次阅读 2017-08-24 15:50:39
    USB转I2C底层代码和原理。
  • 本文未完待续。。。。本人才疏学浅,若有理解出错的地方,欢迎各位大佬批评指教。 参考: 书籍:&lt;&lt;...C语言中文网:http://c.biancheng.net/cpp/html/1919.html 百度文库:http...
  • wk2xxx_i2c_v2.0.rar

    2019-05-17 10:47:33
    WK2204支持i2c转4路串口,附件为wk2204的I2C转4路串口的linux驱动成,亲测可用。
  • 网友问答 | 关于I2C电平转换电路

    千次阅读 2020-07-21 07:45:48
    今天的文章来源于网友问答,我在群里给解答了一下,关于I2C电平转换,我之前写过一篇串口电平转换,其实是一个东西,然后今天我再简单写一下。 聊天记录中给出的原图就是下面这张。 \1. 我首先问了一下,VDD_SN的...
  • 所谓模拟I2C是指使用普通GPIO口的输入输出功能来模拟I2C总线的时序,用来通过I2C总线进行通信。 I2C的基本知识: 1、I2C总线有两条线:SCL是时钟线,SDA是数据线; 2、I2C总线通信方式是主从模式,即由主设备发起...
  • SPI、I2C、UART(即串口)三种串行总线详解

    万次阅读 多人点赞 2019-01-03 09:17:06
    ">I2C需要有双向IO的支持,而且使用上拉电阻,抗干扰能力较弱,一般用于同一板卡上芯片之间的通信,较少用于远距离通信 </tr><tr>;">通信特征 ;">异步,一帧可以传5/6/7/8位 ;">同步,;"><strong>SPI允许数据一...
  • 1602的接线 首先,把转接板焊接到LCD显示屏上(方向如上图) PCF8574T Arduino ... 这个sda scl口是固定的,所以在写程序时候都不用写管脚声明,只需要声明管脚i2c地址即可。 添加...
  • I2C总线是一个真正的多主机总线,如果两个或多个主机同时初始化数据传输,可以通过冲突检测和仲裁防止数据破坏,每个连接到总线上的器件都有唯一的地址,任何器件既可以作为主机也可以作为从机,但同一时刻只允许有...
  • STM32F407之I2C总线(一)

    千次阅读 2015-12-06 23:25:54
    I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。 我的理解:虽然只要求在高电平期间保持稳定,但是要...
  • I2C总线传输协议

    万次阅读 多人点赞 2017-08-20 19:50:10
    I2C总线支持设备之间的短距离通信,它只需要两根信号线来完成信息交换。I2C最早是飞利浦在1982年开发设计并用于自己的芯片上,一开始只允许100kHz、7-bit标准地址。1992年,I2C的第一个公共规范发行,增加了400kHz的...
  • 【stm32】I2C和UART的区别

    千次阅读 多人点赞 2018-09-14 18:23:57
    I2C,又叫IIC。标准写法应当是I2C,读作“I方C”。 两根线、双向传输数据、一对多传输数据、速度不快、通用性很强。 适用场景:各种传感器、小IC、小MCU等。控制指令和小数据量的传输 说到两根线的数据传输方式...
  • ROS i2c 通信(c++版本)

    千次阅读 2021-02-03 14:44:31
    WiringPi是一个用C语言编写的树莓派(RaspberryPi)软件包,可用于树莓派GPIO引脚控制、串口通信、SPI通信及I2C通信等功能,非常适合熟悉C/C++的人员在树莓派上进行软件开发。WiringPi的作者是Gordon Henderson,其...
  • STM32 HAL库 硬件I2C 从机主机防BUG程序

    千次阅读 多人点赞 2020-05-24 02:23:31
    终于在结合各方资料即自己的思考后,做出了稳定的硬件I2C代码(这个文章中应该是目前为止能查到的最详述可用的硬件I2C代码),经过各种奇怪的I2C主机型号的蹂躏后,通讯都可以恢复正常,不会被卡死。证明该方案拥有...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 71,026
精华内容 28,410
关键字:

串口转i2c