TMS320F28335入门(八)SCI学习

/*在我以前在学习、开发MCU的时候,从最初用液晶进行数据显示,到后来一块MCU有多个串口时,在调试的时候基本都是用串口进行数据交互;
但是这块TMS320F28335的串口在哪啊???我熟悉的UART呢???
好吧,,,经过网络搜索,终于知道,TI的串行通信模块叫SCI(Serial Communications Interface)怪我英语差。
先复习一下MCU的通信方式:
并行通信:
特点:速度快、传输线多、不能远距离传输,常用于系统内部DMA控制器或者XINTF接口。
串行通信:
特点:传输线少、速度较慢、需要收发双方有指定的通信协议,可远距离传输。
通常串行通信分为两大类:
同步通信:
发送接收双方通常需要同一时钟源来进行同步,比如i2c、spi这些传输方式都包含一根时钟线
异步通信:
收发双方的不需要一个时钟进行同步,但是要有同一个标称频率,比如波特率;

串行通信,又有三种工作方式:
单工:数据传输是单向的。
半双工:数据传输是双向的,但是在任意时刻,只能由一方发送数据、另一方接收数据,不能同时收发数据;
全双工:数据传输是双向的,可以同时接收或者发送数据;

回到F28335的SCI,我把它看做UART,加上一个232的电平转换芯片就ok了。
让MCU工作的基本操作就是读写相关寄存器。。。
F28335的SCI一共有三个:现在以其中SCIa为例,记录一下它的寄存器描述:
F28335的SCI在基础的UART的功能上,增加了通信速率自动检测和FIFO缓冲等功能,并且接收和发送各自有独立的中断和使能位。
主要寄存器:
SCICCR:通信控制寄存器,主要配置SCI通信模式、数据格式
SCICTL1:控制寄存器1,控制接收、发送使能,TXWAKE和SLEEP功能,和SCI的软件复位(SW RESET位写0可以初始化部分寄存器)
SCICTL2:控制寄存器2,控制启用接收就绪、中断检测和传输就绪中断以及传输就绪和空标志
SCIHBAUD、SCILBAUD:波特率寄存器,两个8位寄存器数据合成一个16位数据,计算公式:
SCI_PRD = (LSPCLK_FREQ/(SCI_FREQ*8))-1;
SCI_FREQ = 115200;
LSPCLK_FREQ = CPU_FREQ/4;
CPU_FREQ = 150E6;
SCI模块的时钟频率属于低速时钟
SCIFFTX、SCIFFRX:SCI的FIFO发送、接收寄存器,主要是对FIFO中断的一个设置,
SCIFFTX寄存器的低五位是发送FIFO的深度设置,TXFFIL4——0(可读可写),
当FIFO的状态位TXFFST4——0(只读)的值小于或者等于TXFFIL4——0的时候,发送FIFO将触发中断。接收FIFO相似。
SCIFFCT:SCI的FIFO控制寄存器,可以控制自动波特率检测,FIFO发送延时。
*/

//只设置接收FIFO中断,在循环中发送数据	

#define CPU_FREQ 	 150E6
#define LSPCLK_FREQ  CPU_FREQ/4
#define SCI_FREQ 	 115200
#define SCI_PRD 	 (LSPCLK_FREQ/(SCI_FREQ*8))-1	
		
void scib_fifo_init()
{
	//初始化SCIb的引脚
	InitScibGpio();

	//映射SCIb接收的中断函数
	EALLOW;	// This is needed to write to EALLOW protected registers
	PieVectTable.SCIRXINTB = &scibRxFifoIsr;
	EDIS;   // This is needed to disable write to EALLOW protected registers

	
	//设置数据格式:1 bit 停止位、无奇偶校验位、8 bit 数据、无回路
	ScibRegs.SCICCR.all =0x0007;   
	//使能发送、接收(并发送接收字符到SCIRXEMU(接收仿真缓冲)和SCIRXBUF(接收数据缓冲))、复位SCI
	ScibRegs.SCICTL1.all =0x0003;  
	//使能SCITXBUF中断,通过置位TXRDY(发送缓冲寄存器就绪标志,SCICTL2寄存器最高位)标志位引发中断
	ScibRegs.SCICTL2.bit.TXINTENA =1;
	//使能RX/BKINTENA(接收缓冲/抑制中断)
	ScibRegs.SCICTL2.bit.RXBKINTENA =1;
	//设置SCI的波特率
	ScibRegs.SCIHBAUD = 0x0000;
	ScibRegs.SCILBAUD = SCI_PRD;
	////使能测试回路,自发自收(测试时用)
	//ScibRegs.SCICCR.bit.LOOPBKENA =1; 
	//设置接收FIFO深度、使能RX FIFO中断
	ScibRegs.SCIFFRX.all=0x0028;
	//非自动检测波特率、无发送延时
	ScibRegs.SCIFFCT.all=0x00;

	//在复位后,启动SCI
	ScibRegs.SCICTL1.all =0x0023;    

	//重新使能接收FIFO
	ScibRegs.SCIFFRX.bit.RXFIFORESET=1;
	
	PieCtrlRegs.PIECTRL.bit.ENPIE = 1;   // Enable the PIE block
    PieCtrlRegs.PIEIER9.bit.INTx3=1;     // PIE Group 9, INT3
}

//接收FIFO中断
__interrupt void sciaRxFifoIsr(void)
{
    Uint16 i;
	for(i=0;i<8;i++)
	{
		//接收数据
	   rdataA[i]=ScibRegs.SCIRXBUF.all;	 
	}

	//清除溢出标志位
	ScibRegs.SCIFFRX.bit.RXFFOVRCLR=1;   
	//清除中断标志位
	ScibRegs.SCIFFRX.bit.RXFFINTCLR=1;    

	PieCtrlRegs.PIEACK.all|=0x100;       // Issue PIE ack
}

//SCIb 发送一个字符
void scib_xmit(int a)
{
    ScibRegs.SCITXBUF=a;
}

//SCIb 发送字符串
void scib_msg(char * msg)
{
    int i;
    i = 0;
    while(msg[i] != '\0')
    {
        scib_xmit(msg[i]);
        i++;
    }
}

你可能感兴趣的:(F28335学习)