按照数据传送方式:分为串行通信和并行通信;
按照通信的数据同步方式:分为同步通信和异步通信;
按照数据传输方向:分为单工,半双工,全双工通信;
(a) 串行通信:使用一条数据线,将数据一位一位的依次传输,没一位数据占据一个固定的时间长度;
优点 :传输线少,长距离传送成本低;
缺点:数据传送控制协议比并行通信复杂;
(b) 并行通信:将数据字节的各位用多条数据线同时传送,通常是8bit,16bit,32bit等数据一起传输;
优点:控制简单,传输快;
缺点:传输线多,长距离传输成本高且接收方同时接收存在困难;抗干扰能力差;
(a) 异步通信:通信双方使用各自的时钟控制数据的发送和接收过程;
为了使双发收发协调,要求双方的时钟尽可能一致;
异步通信是以字符(帧)为单位进行传输,字符与字符间的间隙是任意的;但每个字符中的各位是以固定的时间传送的;
特点:不要求收发双发时钟严格一致,实现容易,设备开销较小,但每个字符要附加2~3位用于起始位,各帧之间还有间隔,所以传输效率不高;
(b) 同步通信:发送方直接控制时钟,达到双方时钟完全同步;
字符间间隔一致,位间间隔一致;
(a)单工通信:数据传输仅能沿一个方向,不能实现反向传输;
(b)半双工通信:数据传输可以沿两个方向,但需要分时进行;
(c)全双工通信: 数据可以同时进行双向传输;
rs232既可以是半双工也可是全双;常用异步全双工通信;
rs485既可以是半双工也可是全双工,常用半双工通信; 点击
SCI:串口通信(Serial Communication Interface)
(a) 单片机使用TTL电平,在与pc通信时,需要使用芯片转换为rs232使用的rs232电平;
(b) 常用的rs232有DB9和DB25;都仅仅需要3线即可实现串口通信,即TXD,RXD,SGND;
(c) r232通常遵循96-N-8-1格式;
其中:
96表示通信波特率为9600;常用还有115200,4800等;
N表示无校验位;由于串口通信易受外部干扰导致数据出现偏差;故传输过程中可加上校验位来解决这问题;校验方法有:基校验,偶校验,0校验,1校验;
8表示数据的位数为8位,其数据格式还可以是5,6,7位长度;
1表示1位停止位;还可以是0.5,1,1.5或2个逻辑1的数据位表示;
注: (a) SCITXD是SCI数据发送引脚,SCIRXD是SCI数据接收引脚;默认管脚作用为gpio,使用时需要管脚复用;
(b) 可编程通信速率;
(1) 可以使用SCI通信控制器(SCICCR)配置SCI通信采用的数据格式;
(2) 接收器使用帧同步,外部发送和接收不需要使用串行同步时钟,时钟由器件本身提供;
/*
SCI波特率计算公式:
BRR = LSPCLK/(SCI异步波特率*8)-1;
*/
void UARTa_Init(Uint32 baud)
{
unsigned char scihbaud=0;
unsigned char scilbaud=0;
Uint16 scibaud=0;
//SCI外设工作频率(37.5MHZ);
scibaud=37500000/(8*baud)-1;
scihbaud=scibaud>>8;
scilbaud=scibaud&0xff;
EALLOW;
SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1; // SCI-A
EDIS;
InitSciaGpio();
//Initalize the SCI FIFO
//bit15:SCI FIFO能继续发送或接收;
//bit14:SCI FIFO功能使能
//bit13:重新使能发送FIFO
//bit4:清除TXFFINT标志位;
SciaRegs.SCIFFTX.all=0xE040;//SCI发送FIFO寄存器
//bit13:重新使能接收FIFO
//bit6:清除RXFFINT标志位
//bit0~3:接收FIFO深度设置;
SciaRegs.SCIFFRX.all=0x204f;//SCI接收FIFO寄存器
SciaRegs.SCIFFCT.all=0x0;
// Note: Clocks were turned on to the SCIA peripheral
// in the InitSysCtrl() function
//bit7: 两位停止位
SciaRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback
// No parity,8 char bits,
// async mode, idle-line protocol
//SCI发送和接收使能
SciaRegs.SCICTL1.all =0x0003; // enable TX, RX, internal SCICLK,
// Disable RX ERR, SLEEP, TXWAKE
//SCITXBUF寄存器中断使能;
//接收缓冲或发送移位中断使能;
SciaRegs.SCICTL2.all =0x0003;
//使能TXRDY中断; SCITXBUF寄存器中断使能;
SciaRegs.SCICTL2.bit.TXINTENA =1;
//接收缓冲/抑制中断使能
SciaRegs.SCICTL2.bit.RXBKINTENA =1;
//波特率设置寄存器高字节
SciaRegs.SCIHBAUD =scihbaud; // 9600 baud @LSPCLK = 37.5MHz.
//波特率设置寄存器低字节
SciaRegs.SCILBAUD =scilbaud;
//自测模式使能
// SciaRegs.SCICCR.bit.LOOPBKENA =1; // Enable loop back
SciaRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset
}
void UARTa_SendByte(int a)
{
while (SciaRegs.SCIFFTX.bit.TXFFST != 0);//一直等待发送完;
SciaRegs.SCITXBUF=a;
}
void UARTa_SendString(char * msg)
{
int i=0;
while(msg[i] != '\0')
{
UARTa_SendByte(msg[i]);
i++;
}
}