ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
【125.1 “双线”的肢体接触通信。】 芯片之间通信,都离不开“数据信号”和“时钟信号”,缺一不可。“数据信号”和“时钟信号”是什么关系,它们是怎样相互配合来实现通信的功能?其实原理也很简单。打个比喻,甲乙两个人,规定只能靠一只“手”和一只“脚”进行肢体接触的通信,他们之间如何传输数据?“手”可以产生“两种”状态“握紧”和“松开”,“脚”可以产生“一种”状态“踢一脚”。他们之间约定,甲发送数据给乙,乙每被甲“踢一脚”就去记录一次手的状态是“握紧”还是“松开”,“握紧”代表二进制的0,“松开”代表二进制的1,这样,如果他们之间想传输一个字节的十六进制数据0x59,只需把十六进制的数据0x59展开成二进制01011001,从右到左(从低位到高位)以“位”为单位挨个发送,过程如下: 第一次“踢一脚”:手的状态是“松开”,记录1。 第二次“踢一脚”:手的状态是“握紧”,记录0。 第三次“踢一脚”:手的状态是“握紧”,记录0。 第四次“踢一脚”:手的状态是“松开”,记录1。 第五次“踢一脚”:手的状态是“松开”,记录1。 第六次“踢一脚”:手的状态是“握紧”,记录0。 第七次“踢一脚”:手的状态是“松开”,记录1。 第八次“踢一脚”:手的状态是“握紧”,记录0。 上述肢体接触的通信过程,其实一只“手”就代表了一根“数据线”,可以产生高电平“1”和低电平“0”这两种状态,而一只“脚”代表了一根“时钟线”,但是“踢一脚”代表了“时钟线”上的一种什么状态呢?注意,“踢一脚”既不是高电平“1”也不是低电平“0”,而是瞬间只产生一次的“上升沿”或者“下降沿”。何谓“上升沿”何谓“下降沿”?“上升沿”是代表“时钟线从低电平跳变到高电平的瞬间”,“下升沿”是代表“时钟线从高电平跳变到低电平的瞬间”。“踢一脚”、“上升沿”、“下降沿”此三者都可以统一理解成“节拍”。 芯片之间通信,“时钟信号”只需1个足矣,而“数据信号”却可以不止1个。1个“数据信号”往往叫“串行”通信,一个节拍只能传输1位数据。8个以上并列的“数据信号”往往叫“并行”通信,一个节拍能传输8位以上的数据。可见,并行的“数据信号”越多,传输的速率越快。 常见的系统中,串口,IIC,SPI,USB,CAN这类都是“串行”通信。而32位单片机与外部的nandflash,norflash,sdram,sram这些芯片通信往往是“并行”通信,并行的数据信号多达8个16个甚至32个。 本节标题之所以强调“双线”,是因为“手”代表数据线,“脚”代表时钟线,一共两条线因此为“双线”。现在把上述的肢体通信过程翻译成C语言代码,甲发送数据的代码如下: sbit Hand\_DATA=P2^6; //手的数据线 sbit Foot\_CLK=P2^7; //脚的时钟线 void SendByte(unsiged char u8Data) //甲发送数据的发送函数 { static unsigned char i; for(i=0;i<8;i++) //一个字节包含8个位数据,需要循环8次 { if(0==(u8Data&0x01)) //根据数据的每一位状态,发送对应的位数据。 { Hand\_DATA=0; //0代表“握紧” } else { Hand\_DATA=1; //1代表“松开” } Foot\_CLK=1; Delay(); //为产生均匀的脉冲节拍,时钟线的高电平先延时一会 Foot\_CLK=0; //从高电平跳变到低电平,产生瞬间的“下降沿”,代表“踢一脚” Delay(); //为产生均匀的脉冲节拍,时钟线的低电平先延时一会 u8Data=u8Data>>1; //右移一位,为即将发送下一位做准备 } }