赞
踩
SPI 是 串行外设接口 的缩写
SPI 具有以下的特点:
同步:需要主机产生的时钟信号来发送数据
串行:对应并行,串行是指数据是一位一位发送的,并行是一次性发送多位
并行节省时间,占用多资源
全双工:同时接受和发送,iic就是半双工
spi也是主从的方式,主机才有权力释放启用主线,从机只能听主机的
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,因为不用发第一位字节寻址
代码
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);
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。