单片机通讯协议

参考:江科大单片机教程 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( 读写?)

相关推荐
jjjxxxhhh1231 小时前
FPGA,使用场景,相比于单片机的优势
单片机·嵌入式硬件·fpga开发
无敌最俊朗@1 小时前
stm32学习之路——八种GPIO口工作模式
c语言·stm32·单片机·学习
EterNity_TiMe_1 小时前
【论文复现】STM32设计的物联网智能鱼缸
stm32·单片机·嵌入式硬件·物联网·学习·性能优化
changingshow2 小时前
Arduino IDE Windows 系统 离线安装 esp32 开发板 亲测好用。
单片机·嵌入式硬件
7yewh5 小时前
嵌入式硬件杂谈(一)-推挽 开漏 高阻态 上拉电阻
驱动开发·stm32·嵌入式硬件·mcu·物联网·硬件架构·pcb工艺
Chervin12 小时前
Windows,虚拟机Ubuntu和开发板三者之间的NFS服务器搭建
linux·单片机·ubuntu·arm
TeYiToKu13 小时前
笔记整理—linux驱动开发部分(8)framebuffer类设备
linux·驱动开发·笔记·嵌入式硬件·arm
7yewh14 小时前
嵌入式硬件电子电路设计(五)MOS管详解(NMOS、PMOS、三极管跟mos管的区别)
stm32·嵌入式硬件·mcu·物联网·硬件架构·硬件工程·pcb工艺
电子工程师UP学堂15 小时前
用单片机MSP430设计一个太阳能实战项目,能够详细的设计出它的硬件和软件系统
单片机
可乐鸡翅好好吃15 小时前
关于stm32中IO映射的一些问题
stm32·单片机·嵌入式硬件