/*在我以前在学习、开发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++;
}
}