因为通信数据的发生是随机的,在不收发数据时串行通信线都是处于空闲状态的,空闲状态通常以高电平表示。当需要发送数据时,串行通信线必须要有一个“动作”以让通信接收方知会我们要开始发送数据了,这样,数据接收方才会作好准备来接收数据。这个开始发送数据前的“动作”就被称为“开始位”。通常以将电平拉低一段时间来表示通信开始标志。
串口通信的缺点就是通信速率较低,且容易出错。
I2C通信协议:
I2C通信是UART通信的改进版。它虽然也采用两个通信导线,但其中有一根线是专门用于传递“时钟信号”的。所谓时钟信号就是一个标准的高低电平交替变化的方波。通信双方都以这个时钟信号作为标准来读写数据。例如,I2C就规定,发送方只有在时钟信号处于低电平状态时才会发送数据,而接收方只有在时钟信号的上升沿阶段才会去读取数据。这种严格的读写分离模式可以保证通信的准确率。同时,也由于I2C通信仅有一根数据线,这也就限死了I2C只能作为半双工通信模式来使用。
SPI通信协议:
前面的 UART 与 I2C 通信协议都有它们各自的优缺点。而 SPI 就是结合了它们二者的优点的产物。SPI通信协议既可以实现全双工通信,又能保证通信准确性。同时它的通信速度也是三者中最快的。
前面就是串行通信中常见的几种协议。串行通信要求数据的收发是“有序的”,而并行通信则可以做到数据收发的“无序性”。这种通信模式的不同,直接导致了并行通信的速度远远高于串行通信。但并行通信的代价也是昂贵的,它需要的通信导线也远远多于串行通信。
串并行通信模式各自都有它们的优缺点,在实际使用过程中需要结合自身需要来选择应用。
在ARM编程中,可以直接对地址进行赋值而不需要创建一个变量,如:
- *(volatile unsigned int *)0x11400020 = 0x22;
复制代码
上面的 0x11400020 即表示ARM芯片中某个寄存器的地址,这条语句的意思就是给这个地址所代表的寄存器赋值 0x22。当然这种编程方式其实并不适合在实际工作是使用。
在ARM下开发串口通信程序的步骤其实很简单:
1、根据原理图找到对应的CPU控制管脚;
2、根据芯片手册找到对应的寄存器;
3、配置串口通信寄存器的模式(功能选择、停止位、校验位、波特率等);
4、编写程序进行收发控制。
唯一的难点就在于阅读芯片手册与寄存器含义了。只要搞懂了这些寄存器的含义,配置正确了,串口通信程序也就很容易写了。
不止是串口通信,任何一种涉及到芯片寄存器的配置都是这种开发方式的。
另外,其实在ARM开发中,C语言中是可以直接调用汇编函数的,C语言中也可以直接嵌入汇编代码。