DSP之RS232通信笔记

1. 通信基本概念

按照数据传送方式:分为串行通信和并行通信

按照通信的数据同步方式:分为同步通信和异步通信;

按照数据传输方向:分为单工,半双工,全双工通信;

(1) 串行通信与并行通信

(a) 串行通信:使用一条数据线,将数据一位一位的依次传输,没一位数据占据一个固定的时间长度;

DSP之RS232通信笔记_第1张图片

优点 :传输线少,长距离传送成本低;

缺点:数据传送控制协议比并行通信复杂;

(b) 并行通信:将数据字节的各位用多条数据线同时传送,通常是8bit,16bit,32bit等数据一起传输;

DSP之RS232通信笔记_第2张图片

优点:控制简单,传输快;

缺点:传输线多,长距离传输成本高且接收方同时接收存在困难;抗干扰能力差; 

 (2) 异步通信与同步通信

(a) 异步通信:通信双方使用各自的时钟控制数据的发送和接收过程;

为了使双发收发协调,要求双方的时钟尽可能一致;

异步通信是以字符(帧)为单位进行传输,字符与字符间的间隙是任意的;但每个字符中的各位是以固定的时间传送的;

DSP之RS232通信笔记_第3张图片

特点:不要求收发双发时钟严格一致,实现容易,设备开销较小,但每个字符要附加2~3位用于起始位,各帧之间还有间隔,所以传输效率不高; 

(b) 同步通信:发送方直接控制时钟,达到双方时钟完全同步;

字符间间隔一致,位间间隔一致;

DSP之RS232通信笔记_第4张图片

(3) 单工,半双工,全双工通信

(a)单工通信:数据传输仅能沿一个方向,不能实现反向传输;

DSP之RS232通信笔记_第5张图片

(b)半双工通信:数据传输可以沿两个方向,但需要分时进行;

DSP之RS232通信笔记_第6张图片

(c)全双工通信: 数据可以同时进行双向传输;

DSP之RS232通信笔记_第7张图片

rs232既可以是半双工也可是全双;常用异步全双工通信; 

rs485既可以是半双工也可是全双工,常用半双工通信; 点击

2. SCI介绍

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的数据位表示;

DSP之RS232通信笔记_第8张图片 SCI与CPU连接图

注: (a) SCITXD是SCI数据发送引脚,SCIRXD是SCI数据接收引脚;默认管脚作用为gpio,使用时需要管脚复用;

      (b) 可编程通信速率;

 (1) 可以使用SCI通信控制器(SCICCR)配置SCI通信采用的数据格式;

  (2) 接收器使用帧同步,外部发送和接收不需要使用串行同步时钟,时钟由器件本身提供;

3. 软件部分

/*
    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++;
	}
}

你可能感兴趣的:(DSP,dsp开发,rs232)