先来看一下常见的通信方式分类方法
串行or并行?
串行通信 一次只能发送一位,要发送8次才能发送一个字节。
并行通信 通信时数据的各个位同时传送,可以实现字节为单位通信,但是通信线多占用资源多,成本高。
**同步or异步? **
同步通信:所有设备使用一个共同的时钟信号,发送和接收双方严格按照该时钟信号处理数据的发送和接收。同步通信的优点是数据传输速率高,缺点是要求发送时钟和接收时钟保持严格同步。 SPI和I2C属于同步通信。
异步通信:异步通信中,每个设备都有自己的时钟信号,通信双方的时钟频率保持一致。异步通信以字符为单位进行数据传送,每一个字符均按照固定的格式传送,被称为帧,即串行异步通信一次传送一个帧。UART属于串行异步通信
串口通信
串口通信,顾名思义也就是利用串行接口进行通信。串口通信和串行通信的区别在于:串行通信是一种概念,串口通信是一种是实现串行通信的具体的通信手段。
串口通信连接包括两根线,发送和接受双方交叉连接
一个RXD(Receive Data,RXD),表示接收数据
一个TXD(Transmit Data,RXD),表示发送数据
串行通信,异步通信,既可以半双工也可以全双工
那么实际传输过程中,串口通信是一帧一帧组成的。每一帧数据由起始位(低电平)、数据位、奇偶校验位(可选)、停止位(高电平)组成
而通信前,需要进行配置协商,需要配置的量有
串口号
波特率:波特率必须一致,是传输速率,每秒传多少码元
数据位:设置数据位有几位
停止位:设置停止位几位
校验位:设置是否有校验位
流控制
这里有一个概念,叫做波特率
波特率 vs 比特率
• 波特率表示每秒钟传送的码元符号的个数,它用单位时间内载波调制状态改变的次数来表示。单位:码元/s,所以它与比特率是不同的概念
• 比特率表示每秒钟通过信道传输的信息量,也就是每秒钟传送的二进制位数。 单位:bit/s、比特/秒
• 不同的调制方法可在一个码元上负载多个比特信息。比特率=波特率*单个调制状态对应的二进制位数
• 对于二进制的信号,码元速率和信息速率在数值上是相等的。 因此,对于串口来说,比特率=波特率
• 但要注意:这里的比特率并不是应用层的有效数据传输率,因为开始位、停止位、校验位占了开销。
1 时钟速率配置
时钟控制命令寄存器CLKCONCMD
举例
CLKCONCMD &=0x80; //时钟频率为32MHZ
使用UART之前的引脚配置步骤
2 功能选项位置配置
使用寄存器PERCFG
举例
PERCFG=0x00;
3 使能引脚的外设功能 -USART功能
P0SEL寄存器
4 确定多功能的优先级
P2DIR寄存器
在这里插入图片描述
P2DIR&= ~0XC0; //P0优先作为串口0
5 使能USARTx的UART模式
U0CSR寄存器 //UART模式
U0GCR寄存器 //baud_e
U0CSR |= 0x80; //UART模式
U0GCR |= 10; //baud_e
没有用到U0UCR
6 波特率设置
U0BAUD寄存器
7 初始化中断标志位
UTX0IF寄存器
8 使能总中断
1 确定PIN
2 使能引脚外设功能
3 确定功能选项位置,确定多功能的优先级(可选)
4 使能USARTx的UART模式
寄存器USARTx
寄存器UxCSR
UxGCR
if(UartState == UART0_TX) //发送状态
{
U0CSR &= ~0x40; //禁止接收
UartSendString(RxData, count); //发送已记录的字符串。
U0CSR |= 0x40; //允许接收
UartState = UART0_RX; //恢复到接收状态
count = 0; //计数清0
memset(RxData, 0, SIZE); //清空接收缓冲区
}
每个USART都有两个中断:
– 发送数据完成中断(URXxIF)
– 接收数据完成中断(UTXxIF)。
IEN2 |=0x04; //开USART0发送中断
#pragma vector = UTX0_VECTOR
__interrupt void UART0TX_ISR(void)
{
txNext=1 ;
UTX0IF = 0; //清中断标志
}
if(UartState == UART0_RX) //接收状态
{
while(URX0IF==0);
URX0IF=0;
RxBuf = U0DBUF;
if(RxBuf != 0)
{
if((RxBuf != '#')&&(count < 50))//以'#'为结束符,一次最多接收50个字符
RxData[count++] = RxBuf;
else
{
if(count >= 50) //判断数据合法性,防止溢出
{
count = 0; //计数清0
memset(RxData, 0, SIZE);//清空接收缓冲区
}
else
UartState = UART0_TX; //进入发送状态
}
RxBuf = 0;
}
}
IEN0 |=0x84; //开接收中断
#pragma vector = URX0_VECTOR
__interrupt void UART0RX_ISR(void)
{
RxBuf = U0DBUF; //取出接收到字节
URX0IF = 0; //清中断标志
}
串行通信,全双工,同步通信
UART只有两根线,而SPI要四根线
– SSEL:片选,也写做SSN,从设备片选使能信号。
– SCLK:时钟,也写作SCK,由主机产生,和SCL类似
– MOSI:主机输出从机输入,Master Output/Slave Input,主机给从机发送指令或
者数据的通道。
– MISO:主机输入从机输出,Master Input/Slave Output,主机读取从机的状态或
者数据的通道
Master-Slave
– SPI通信的参与方中只有一端提供时钟,称为Master,其他为Slave
– SPI通信可以一个Master,多个Slave, 通过片选信号选择当前通信的Slave设备
CPOL:时钟极性,CPOL=1,表示空闲状态为高电平,CPOL=0,表示空闲状态为低电平,就是不处于发送状态的时候是什么电平
CPHA:时钟相位,CPHA=1 表示数据的输出是在第一个时钟周期的第一个沿,CPHA=0,表示数据的采样是在第一个时钟周期的第一个沿
数据的输出和数据的采样的区别
就是这样的
首先数据传输的时候肯定会有一个发送方(主机)和一个接收方(从机)
他们(发送方和接收方)俩在我们这门课里是通过一条线相连的
发送方一个比特一个比特的发送,发送1 的时候将线上的电平置位高电平,发送0 的时候将线上的电平置位低电平(也就是我们的数据输出,数据输出可以理解为将电线上电平进行调整的过程)
接收方一个比特一个比特的接收(也就是我们的数据采样,数据采样就可以理解为接收方获得线上此时的电平高低,高电平则收到1,低电平则收到0
1 引脚配置
• Slave模式中,四条线都配置为外设功能
• Master模式中,MOSI, MISO, and SCK配置为外设功能,SSN配置为GPIO功能(output)
寄存器PERCFG
PxSEL
PxDIR
2 配置SPI时钟的波特率
在UxBAUD中配置BAUD_M
在U型GCR中配置BAUD_E
3 配置SPI的 Master或SPI Slave模式
用UxCSR寄存器
4 配置时钟极性、时钟相位、Bit顺序
UxGCR.CPHA和UxGCR.CPOL
比如 CC2530向液晶屏传输信息
比如外界向CC2530传输信息
SPI液晶屏是典型应用
需要两线式 串行总线,可以发送和接收数据
从应用上来讲,UART通信多用于板间通信,I2C多用于板内通行
I2C总线组成线与的关系,任何一个器件都可以拉低电平
I2C总线可以并联多个器件
I2C总线有起始信号,数据传输和停止信号
起始信号 SCL为高电平期间,SDA由高电平向低电平变化时产生一个下降沿
数据传输 MSB first,SCL是低电平,才可以改变数据线SDA,输出要发送的数据的一位,SCL在高电平的时候,SDA绝对不可以变化,每个字节跟了一个应答位(拉低SDA即输出“0”)
停止信号 SCL为高电平期间,SDA由低电平向高电平变化产生一个上升沿
发送方:7位地址+1位读写位,其中高四位是厂商固定设备ID,低三位取决于具体电路设计,最后1位代表是读0还是写1
接收方:回应一个ACK
I2C通信分为低速模式100kbit/s、快速模式400kbit/s和高速模式3.4Mbit/s。
单字节读,多字节读