单片机通讯协议

参考:江科大单片机教程 STM32入门教程-2023版 细致讲解 中文字幕_哔哩哔哩_bilibili

|------|-------------|----------------|------|-----|-----|
| | IIC通讯协议 | SPI通信协议 | UART | CAN | USB |
| 速度 | 100k-400khz | 4Mhz- | | | |
| 线数 | 2 CLK,DATA | 4CLK,ENB,IO,OI | | | |
| 额外设备 | | | | | |
| | 一主多从 | 一主多从 | | | |

一般不用自己写,都有相应的库或官方提供相应的,改改就行,没有了再去看视频或是从其它处移植过来,改改;

IIC通讯协议

通信时序 发送数据过程 发送地址 接收1位 发送数据 置高 继续接收 继续发送

可以软件模拟

因为多设备 ,并且只有两条线 ,因为设备内有多个寄存器,从而数据发送,读写时,需要发送设备地址和设备寄存器地址(连接上地线

写时序: 七位设备地址,和一位读写位 ;设备应答后,发送写入的地址,应答后,写入数据

设备地址和内部寄存器地址

读时序:当前地址读;因为地址为当前地址,从而要读特定地址时,要用写时序写入地址,不发送数据,然后发送重新开始信号,再进行读时序

连续写,连续读,只要接收或读取数据后,给出应答,即会连续

一条CLK 一条DATA线

多个设备

因为时钟线为主机控制,所以可以中断停止后再继续接收,发送

SPI通信协议

可以软件模拟(但软件模拟从机时,容易出现丢帧,导致后续数据都是错的。。。但可以用于LCD等

CLK,MOSI,MISO,CS1,CS2,CS3

一对多;多个设备;对设备的选择通过CS1,CS2,CS3的拉底来实现

采用循环发送数据模式;MOSI 发出一位的同时置换回MISO内的一位,直到一个字节发送完,同时也接收了从机的一个字节

读写格式,依不同的设备而定;没有统一的,按具体设备翻看手册

连续读写,只要cs线没断开就可以连续;断开则停止

因为时钟线为主机控制,所以可以中断停止后再继续接收,发送

UART通信协议

一对一

TX RX GND

使用内部时钟作为时钟,导致通信双方需要相同的波特率;

因为内部时钟,从而有校验位,为信息传递进行准备性,抗干扰设置

读写协议格式:自已协定

连续读写:连续

TTL电平:+3.3V或+5V表示1,0V表示0

RS232电平:-3~-15V表示1,+3~+15V表示0

RS485电平:两线压差+2~+6V表示1,-2~-6V表示0(差分信号)

------来自江科大:PPT

一般不会使用到,使用到时通常有操作系统,或是驱动已经集成了,只需要使用即可;使用于嵌入式,高效,稳定阶段,有专门的驱动,不需

多设备同时传输 ,从而需要确定传输方是谁,多人同时传输,只有两线,从而决定,谁先谁后,从而协议;

时钟来源:主设备,还是内部时钟

SPI,UART,I2C 因从设备选择由主机控制,实现主从,从而不需要确定传输方和仲裁先后

*CAN通信协议(CAN总线入门教程 - 持续更新中_哔哩哔哩_bilibili

需要额外外部电路

一对多,主从可以变化;一发送,其它的接收,

组成网络结构,任何一方皆可发送;其它方接收;发送方切换

信息稳定性,同时传输

从而有仲裁,信息传输正确;从而使用协议验证

传输距离,稳定性

*USB通信协议

差分电路,抗干扰,运输长度

有多设备,从而有总线仲裁,谁先使用

有多设备,从而信息传递中,信息的传输方来源,使用信息符带地址,验证,信息

一,不需要重新写协议,除非你要移植到新出的产品上,(一般也只需要使用原有的修改一下即可,要了解具体的过程的

二,一般都会提供相应的协议的实现的,不需要再

三,具体场景具体使用,不需要使用高的,一般的需求已经满足了,高的用不到------

总结一下

根据主机挂载从机的数量,与选择从机的方式

|---------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------|---|
| uart | i2c | spi | can | USB | |
| 一对一 | 两根线选择所有的从机 | 通过各个cs线选择不同的从机 | 形成网络结构任意一方可成为主机 | 可挂载多个设备 | |
| 只有两个设备地址就不需要了 | 从而需要地址来确定选择哪个设备 | 直接通过csx选择不同的从机,地址可省略了 | 两线,从而需要地 | 一个usb 主机可挂载多个usb设备,D+D-选择,从而需要地址, | |
| | | | | | |

连线方式

uart

rx->tx tx->rx gnd->gnd

spi

SCL ->SCL ; MISO->MOSI GND->GND

I2C

CLK->CLK; DAT ->DAT

arudino

I2C 协议 与 移植

asrpro

1.添加头文件

2.修改函数

SSD1306 移值

ASRPRO - ssd1306的核心函数 按网上的u8g2移植过程,修改代码如下

复制代码
uint8_t u8x8_avr_gpio_and_delay(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
  {
        // Re-use library for delays

        switch(msg)
        {
          //ms
                case U8X8_MSG_DELAY_MILLI:
        delay(1);
      break;
     
      //10 us
      case U8X8_MSG_DELAY_10MICRO:
        delay10us();
      break;
     
      //1 ns
           case U8X8_MSG_DELAY_NANO:
        delay1us();
      break;
     
    case U8X8_MSG_DELAY_100NANO:
      delay1us();
      break;
     
               case U8X8_MSG_GPIO_AND_DELAY_INIT:  // called once during init phase of u8g2/u8x8
        ssd1306_spi_init();
                       break;              // can be used to setup pins
               case U8X8_MSG_GPIO_SPI_CLOCK:        // Clock pin: Output level in arg_int
                       if(arg_int)
                               digitalWrite(SCK,1);
                       else
                               digitalWrite(SCK,0);
                       break;
               case U8X8_MSG_GPIO_SPI_DATA:        // MOSI pin: Output level in arg_int
                       if(arg_int)
                               digitalWrite(MOSI,1);
                       else
                               digitalWrite(MOSI,0);
                       break;
               case U8X8_MSG_GPIO_CS:        // CS (chip select) pin: Output level in arg_int
                       if(arg_int)
                               digitalWrite(CS,1);
                       else
                               digitalWrite(CS,0);
                       break;
               case U8X8_MSG_GPIO_DC:        // DC (data/cmd, A0, register select) pin: Output level in arg_int
      if(arg_int)
                               digitalWrite(DC,1);
                       else
                               digitalWrite(DC,0);
                       break;
              
               case U8X8_MSG_GPIO_RESET:     // Reset pin: Output level in arg_int

               default:
                 break;

        }
        return 1;
}

*PCA9865

*使用官方的softiic修改下发送地址 地址即可 左移一位 0,1( 读写?)

相关推荐
小柯博客3 小时前
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(十二)
c语言·stm32·单片机·嵌入式硬件·php·嵌入式
SY师弟6 小时前
51单片机基础部分——独立按键检测
单片机·嵌入式硬件·51单片机
Mapleay6 小时前
FMC STM32H7 SDRAM
stm32·单片机·嵌入式硬件
自小吃多7 小时前
STC8H系列 驱动步进电机
笔记·单片机
易知嵌入式小菜鸡7 小时前
STM32CubeMX-H7-19-ESP8266通信(中)--单片机控制ESP8266实现TCP地址通信
stm32·单片机·嵌入式硬件
乄夜7 小时前
嵌入式面试高频(5)!!!C++语言(嵌入式八股文,嵌入式面经)
c语言·c++·单片机·嵌入式硬件·物联网·面试·职场和发展
c7_ln9 小时前
STM32 低功耗设计全攻略:PWR 模块原理 + 睡眠 / 停止 / 待机模式实战(串口 + 红外 + RTC 应用全解析)
stm32·单片机·实时音视频·江协科技
待什么青丝10 小时前
【TMS570LC4357】之相关驱动开发学习记录2
c语言·arm开发·驱动开发·单片机·学习
小柯博客10 小时前
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
c语言·stm32·单片机·嵌入式硬件·物联网
云山工作室11 小时前
一种停车场自动停车导航器的设计(论文+源码)
单片机·嵌入式硬件·毕业设计·毕设