TMS320F28335入门1- SCI串口

TMS320F28335的串口编程配置,参考 《普中科技DSP28335开发攻略》  和 TI官方芯片手册《TMS320F2833x, 2823x Serial Communications Interface (SCI) Reference Guide (Rev. A)》


一. 介绍

串 行 通 信 接口 口 (SCI) 模 模块 块 (SCI-A ,SCI-B ,SCI-C)
该器件包括三个串行通信接口(SCI)模块。 SCI 模块支持 CPU 与其它异步外设之间的使用标准非归零码(NRZ) 格式的数字通信。 SCI 接收器和发射器是双缓冲的,并且它们中的每一个有其自身独立的使能和中断位。 两个器件都可独立或者同时地运行在全双工模式。 为了确保数据完整性,SCI 在中断检测、奇偶校验、超载、和组帧错误方面对接收到的数据进行检查。 通过一个 16 位波特率选择寄存器,可将比特率设定为超过 65000 个不同的速度。

增强型特性:
• 自动波特率检测硬件逻辑电路
• 16 级发送/接收 FIFO


二. SCI 配置

2.1 寄存器

TMS320F28335入门1- SCI串口_第1张图片

 

2.1.1 SCICCR - 通信控制寄存器

停止位、奇偶校验、数据长度等的配置

TMS320F28335入门1- SCI串口_第2张图片

每一位含义:

TMS320F28335入门1- SCI串口_第3张图片

 

2.1.2  SCICTL1 - 控制寄存器1

控制TX、RX的使能等

 

TMS320F28335入门1- SCI串口_第4张图片

TMS320F28335入门1- SCI串口_第5张图片

TMS320F28335入门1- SCI串口_第6张图片

TMS320F28335入门1- SCI串口_第7张图片

 

2.1.2  SCIHBAUD、SCILBAUD - 波特率设置寄存器

配置串口的波特率大小

TMS320F28335入门1- SCI串口_第8张图片

TMS320F28335入门1- SCI串口_第9张图片

根据手册可知:BRR = LSPCLK/(SCI 异步波特率*8)-1

 

2.1.4  SCICTL2 - 控制寄存器2

发送空标志位、接收和发送中断使能

 

各位含义如下:

TMS320F28335入门1- SCI串口_第10张图片

TMS320F28335入门1- SCI串口_第11张图片

 

2.1.5  SCIRXST- 接收状态寄存器

接收数据的错误标志位、就绪标志位、接收被间断、帧格式错误标志位

各位含义如下:

TMS320F28335入门1- SCI串口_第12张图片

TMS320F28335入门1- SCI串口_第13张图片

只要发生错误,bit0错误标志位就置1

TMS320F28335入门1- SCI串口_第14张图片

 

2.1.6  SCIRXEMU、SCIRXBUF- 数据接收缓冲寄存器

Emulation Data Buffer (SCIRXEMU)、Receiver Data Buffer (SCIRXBUF)

接收到的数据从 RXSHF 传送到 SCIRXEMU 和 SCIRXBUF。传送完成以后 RXRDY (bit SCIRXST.6)置位,表明接收的数据已被读取。两个寄存器的数值完全一样,它们有各自独立的地址,但是共用一个物理存储空间。他们唯一的区别就是,读取 SCIRXEMU的数据不会清除 RXRDY 位,而读取 SCIRXBUF 会清除 RXRDY 位。因此一般读取 SCI接收的数据都是读取 SCIRXBUF 寄存器。SCIRXEMU 寄存器主要用于仿真时,因为它可以不清除 RXRDY 标志位而不断读取接收到的数据。在系统复位时 SCIRXEMU被清空。其各位功能描述如下:

TMS320F28335入门1- SCI串口_第15张图片

TMS320F28335入门1- SCI串口_第16张图片

 

2.1.7  SCITXBUF- 数据发送缓冲寄存器

需要发送的数据将被写入该寄存器,数据使用右对齐方式。要发送的数据从该寄存器中传送到 TXSHF 移位发送寄存器后 TXRDY  (SCICTL2.7)置位,表明该寄存器可以写入下一个需要发送的数据。若 TX INT ENA  (SCICTL2.0)置位,数据发送可以出发中断。

 

2.1.8  SCIFFTX-  发送 FIFO 寄存器

发送FIFO的使能配置、FIFO中断标志位、发送FIFO的深度设置

TMS320F28335入门1- SCI串口_第17张图片

 

TMS320F28335入门1- SCI串口_第18张图片

TMS320F28335入门1- SCI串口_第19张图片

2.1.9  SCIFFRX-  接收 FIFO 寄存器

 

TMS320F28335入门1- SCI串口_第20张图片

TMS320F28335入门1- SCI串口_第21张图片

TMS320F28335入门1- SCI串口_第22张图片

2.1.10  SCIFFCT -  FIFO 控制寄存器

使能波特率的自动检测()

在 F28335 处理器上,增强功能的 SCI 模块硬件支持自动波特率检测逻辑。寄存器 SCIFFCT 的 ABD 位和 CDC 位控制自动波特率逻辑,使能 SCIRST 位使自动波特率逻辑工作。增加自动波特率检测功能的 SCI 通信接口除了能够满足正常通信自动检测系统的通信速率外,还支持采用 SCI 接口上电引导装载程序,这对于通过上位机采用 SCI 接口实时更新系统软件非常重要。

当 CDD 为 1,如果 ABD 也置位1,表示自动波特率检测开始工作,就会产生 SCI发送 FIFO 中断(TXINT)。同时在中断服务程序中必须使用软件将 CDC 位清零,否则如果中断服务程序执行完 CDC 仍然为 1,后面就不会产生中断。具体的操作步骤如下:
①将 SCIFFCT 中的 CDC 位置位1,清除 ABD 位(位 15),使能 SCI 的自动波特率检测模式
②初始化波特率寄存器为 1 或限制在 500kbps 内。
③允许 SCI 以期望的波特率从一个主机接收字符“A”或字符“a”。如果第一个字符是 A 或者 a,则说明自动波特率检测已经检测到 SCI 通信的速率,然后将 ABD 位置 1。
④自动检测硬件将用检测到的波特率的十六进制值刷新波特率寄存器的值,这个刷新逻辑也会产生一个 CPU 中断。
⑤通过向 SCIFFCT 寄存器的 ABD CLR 位写入 1 清除 ABD 位,响应中断。写 0清除 CDC 位,禁止自动波特率逻辑。
⑥读到接收缓冲器的字符 A 或者 a 时,清空缓冲和缓冲状态位。
⑦当 CDC 为 1 时,如果 ABD 也置位表示自动波特率检测开始工作,就会产生SCI 发送 FIFO 中断(TXINT),同时在中断服务程序中必须使用软件将 CDC 位清0。

TMS320F28335入门1- SCI串口_第23张图片

TMS320F28335入门1- SCI串口_第24张图片

2.1.11  SCIPRI-   优先级控制寄存器

TMS320F28335入门1- SCI串口_第25张图片

2.2 程序编程

2.2.1 串口的初始化

第一步. 使能 SCI 外设时钟及初始化对应 GPIO

第二步.SCI 工作方式及参数设置,包括数据格式、波特率、使能发送、接收功能等;FIFO使能、深度设置; 接收和发送中断使能配置

void UARTa_Init(Uint32 baud)
{
	unsigned char scihbaud=0;
	unsigned char scilbaud=0;
	Uint16 scibaud=0;

	scibaud  = 37500000/(8*baud)-1;
	scihbaud = scibaud>>8;
	scilbaud = scibaud&0xff;

        //第一步. 使能 SCI 外设时钟及初始化对应 GPIO   ----------------
	EALLOW;
	SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1;   // 使能SCI-A时钟
	EDIS;
        
        //SCI 的 GPIO 初始化配置,TI 已经在库文件内提供给我们了
        //使用哪个 SCI 口可通过宏定义决定,该宏定义在 DSP2833x_Device.h 头文件内已定义了,
        //使用哪个就将宏值改为 1 即可
	InitSciaGpio();
        //------------------------------------------------------
        
    
        //第二步.SCI 工作方式及参数设置,包括数据格式、波特率、使能发送、接收功能等。
	//Initalize the SCI FIFO
	SciaRegs.SCIFFTX.all=0xE040;// FIFO功能使能、重新使能发送FIFO、清除TXFFINT标志位
	SciaRegs.SCIFFRX.all=0x204f;//重新使能接收FIFO、清除RXFFINT标志位、接收FIFO深度设置为16
	
        SciaRegs.SCIFFCT.all=0x0;//波特率非自动检测

	// Note: Clocks were turned on to the SCIA peripheral
	// in the InitSysCtrl() function
	SciaRegs.SCICCR.all =0x0007;   // 1 stop bit,  No loopback
								   // No parity,8 char bits,
								   // async mode, idle-line protocol
	SciaRegs.SCICTL1.all =0x0003;  // enable TX, RX, internal SCICLK,
								   // Disable RX ERR, SLEEP, TXWAKE
	SciaRegs.SCICTL2.all =0x0003;
	SciaRegs.SCICTL2.bit.TXINTENA =1; //使能TXRDY中断
	SciaRegs.SCICTL2.bit.RXBKINTENA =1;  //使能RXRDY、BRKDT中断
	SciaRegs.SCIHBAUD    = scihbaud ;
	SciaRegs.SCILBAUD    = scilbaud ;
	//SciaRegs.SCICCR.bit.LOOPBKENA =1; // Enable loop back
	SciaRegs.SCICTL1.all =0x0023;     // Relinquish SCI from Reset,发送使能、接收使能
}

波特率具体配置计算问题:

1. 来源

SCI时钟来至于:

TMS320F28335入门1- SCI串口_第26张图片

2. SYSCLKOUT的大小

笔者开发板外部晶振使用的为30MHz

TMS320F28335入门1- SCI串口_第27张图片

根据时钟树 其中:PLLCR.bit.DIV = 0x1010

     TMS320F28335入门1- SCI串口_第28张图片

PLLSTS.bit.DIVSEL = 2

TMS320F28335入门1- SCI串口_第29张图片

所以:SYSCLKOUT = 30M * 10 /2 = 150Mhz

 

3. 计算SCI时钟

时钟配置函数里面LOSPCP配置:

TMS320F28335入门1- SCI串口_第30张图片

TMS320F28335入门1- SCI串口_第31张图片

所以 SCI时钟为150M /4 = 37.5MHz

2.2.2 串口数据发送函数

单数据发送

// Transmit a character from the SCI'
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++;
	}
}

2.2.3 串口数据接收函数

2.2.3.1 采用查询方式接收

// Wait for inc character
while(SciaRegs.SCIFFRX.bit.RXFFST !=1);// wait for XRDY =1 for empty state
// Get character
ReceivedChar = SciaRegs.SCIRXBUF.all;

2.2.3.2 采用中断方式接收

 

 

 

 

 

 

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