当前位置:   article > 正文

SPI协议_spi msb

spi msb

SPI 基础知识

SPI 是 串行外设接口 的缩写
在这里插入图片描述
SPI 具有以下的特点:

同步:需要主机产生的时钟信号来发送数据
串行:对应并行,串行是指数据是一位一位发送的,并行是一次性发送多位
并行节省时间,占用多资源
全双工:同时接受和发送,iic就是半双工
spi也是主从的方式,主机才有权力释放启用主线,从机只能听主机的
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述
在这里插入图片描述
sck也是时钟,时钟有什么用呢,就像发送一个01,是高,低,发送一个0011也是高,低电平,所以需要有一个时钟来界定范围,

像异步,使用波特率,持续一秒表示一个一,两秒就是两个一(波特率),双方收发没有一个公用的时钟基准,所以多了会有偏差,只能少发点,一个一个发

iic除了数据线,还有scl时钟线,告诉双方什么时候收发,连起来了收发方,所以能够使收发同步

共用一个时钟叫做同步通讯,

为什么spi至少需要4根线,什么时候用到多4线?多个从机,因为cs线是每个从机都要有的,其他的共用那三个线

mosi:master out slave in
cs:chip select 用于寻址

虽然有很多从机,但是不能说同时和好多从机通讯,只能选一个来通讯:
spl:向cs1发送数据,就需要使能,使cs1保持高/ 低电平,cs2,cs3保持低/高电平,保持不同,这样只有1能接受数据(高低根据芯片,判断的依据:看电路图,原理图,说明低电平使能:cs上面有一个杠,否则就是高电平有效)
iic:开始通讯的时候,总线发送一个从机地址以及读写位(我找谁。哎,我就是)
0x55—101010
spl先发高位msb后发低位lsb,iic中发完了,接受方也需要回一个应答位,表示收到了,但是spi没有,不用应答直接发下一个字节
没有应答位的影响:就像对话一样,spi有可能发送器一直发,但是接收器没有收到。而且spi没有起始信号,也没有终止信号。
像上面讲的,spi怎么知道你发送的是几个1?像串口,用的就是掐时间,顶个波特率—异步
同步:时钟线时钟线为低电平的时候,发送器放一位数据,如果时钟线变成高电平,接受的去读刚刚的数据,8个时钟周期就看可以完成一个字节
而spi凭借第一次的转变而转变
在这里插入图片描述
在这里插入图片描述
相位和极性可以通过寄存器配置,也可以从手册里面查到,但是从机一般出厂就会设定好极性和相位,你就需要配置成和芯片一样,在这一块上,主机跟从从机

在这里插入图片描述

ttl电平:高电平表示1,低电平表示0,传输距离不是太长,一般用于小电路板上

spi占用资源大因为cs,但是快于iic,因为不用发第一位字节寻址

代码

在这里插入图片描述

821 主要Spi_etherr 源码

bool checkEthConnection() {
  try {
    vector<string> v;/*vector是一个能够存放任意类型的动态数组,能够增加和压缩数据vector<string>是字符串容器
比如vector<string> s[2]
这句话的意思就是定义了一个字符串容器 s ,里面可以存放2个字符串*/
    std::array<char, 128> buffer;/*using namespace std      std*/
    //ping821的地址,c表示2次,w表示几秒
    std::unique_ptr<FILE, decltype(&pclose)> pipe( popen("ping 192.168.2.20 -c 2 -w 2", "r"), pclose);
	//如果连接不上,就会抛出
    if (!pipe) {
    //std::runtime_error:运行时错误异常类,只有在运行时才能检测到的错误
      throw std::runtime_error("popen() failed!");
      return true;
    }
    /*下面是 fgets() 函数的声明。

char *fgets(char *str, int n, FILE *stream)
参数
str -- 这是指向一个字符数组的指针,该数组存储了要读取的字符串。
n -- 这是要读取的最大字符数(包括最后的空字符)。通常是使用以 str 传递的数组长度。
stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字符的流。
返回值
如果成功,该函数返回相同的 str 参数。如果到达文件末尾或者没有读取到任何字符,str 的内容保持不变,并返回一个空指针。

如果发生错误,返回一个空指针。*/
    while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr) {
      v.push_back(buffer.data());
    }

    /*读取最后两行 
                不通的长这样
                --- 192.168.1.10 ping statistics ---
                2 packets transmitted, 0 packets received, 100% packet loss

                通的长这样
                --- 192.168.1.11 ping statistics ---
                2 packets transmitted, 2 packets received, 0% packet loss
                round-trip min/avg/max = 0.146/0.702/1.258 ms

                完全不通的长这样
                PING 192.168.1.10 (192.168.1.10): 56 data bytes                                                                   
                ping: sendto: Network is unreachable 
    */
    if (v.size() > 1) {   //捕获到的数据最少有两行
      string data = v[v.size() - 1];  // 先找最后一行
      int iPos = data.find(", 0% packet loss");//看看能不能找到这串数据
      if (iPos != -1) {
          //找到 , 0% packet loss 认为是通的
          return true;
      }

      data = v[v.size() - 2];  // 找倒数第二行
      iPos = data.find(", 0% packet loss");
      if (iPos != -1) {
          //找到, 0% packet loss 认为是通的
          return true;
      }
    }
    return false;
  } catch (std::exception e) {//如果出现异常就会:
    LOG4CPLUS_ERROR(logger, LOG4CPLUS_TEXT("parse shell result error:"<<e.what() ));
  }
  LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("parse shell result error"));
  return true;
}


void *netStateProc(void *arg){
    //刚开机的时候,要等网络准备好
    sleep(10);
    while(1){
        bool state = checkEthConnection();//checkEthConnection返回的是个布尔值
        if(!state){//如果返回的是false没有抓到,取反为true,执行count++
            errCount ++;
        }else{
            errCount = 0;
        }
        if(errCount == 2 || (errCount %101 == 0)){  //连续两次ping 结果100% loss
            LOG4CPLUS_ERROR(logger, LOG4CPLUS_TEXT("network ERROR!!! errcout:"<< errCount));
        }
        sleep(1);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/50806?site
推荐阅读
相关标签
  

闽ICP备14008679号