DSP相关笔记_5:LaunchXL-F28379D的简单教程系列(四)SCI简单使用_1
注:
1)这是本人关于Ti的C2000系列的学习笔记,所用工具有官方的开发软件CCS10版本,帮助文库以及函数库软件controlSUITE。硬件部分LaunchXL-F28379D和逻辑分析仪一台。
2)需要之前的LAUNCHXL教程的,请各位自己查找这里就不占位置了
这里上一下外围的引脚图,它的具体实现的外设需要查表
废话就不多了,今天就是来说常用的数据通信外设SCI,跟我以前一样是玩STM32可能更加熟悉USART这种说法,当没有关系,我不会将太多理论东西,但会把流程基本过一下,需要做些什么就能简单,本身它还有更多高级用法等后面慢慢说。
首先要知道这是一个串行通信接口(SCI)模块的特性和操作。SCI是一个两线异步串行端口,通常被称为UART。
其中连线为SCITX(output)和SCIRX(input,异步方式),在配置GPIO的时候需要明确两根线方向,前者为输出、后者为输入,其实为了数据稳定可以把上位机和LAUNCHXL的GND相连。
这里给大家看一下它参考手册的pin配置的解释
如下图:
就是我简单说的,这里涉及的寄存器是GPxDIR,GPxGMUX1或GPxGMUX2,GPxMUX1或GPxMUX2,其中输入还要涉及采样配置的寄存器GPxQSEL1或GPxQSEL2。
而进行外设配置的时候需要查表,这里我选择GPIO8和GPIO9实现SCI的外设功能, 如下表:
因为最终的实现是官方提供的两个配置函数,因此我们等一下需要将外设功能标号填写即可,绿色中的6就行了。
先给大家看一下GPIO这边的代码
void SciGpioInitial (void)
{
//GPIO8->SCITXDA output
GPIO_SetupPinMux(8, GPIO_MUX_CPU1, 6);
GPIO_SetupPinOptions(8, GPIO_OUTPUT, GPIO_PUSHPULL);
//GPIO9->SCITXRX input
GPIO_SetupPinMux(9, GPIO_MUX_CPU1, 6);
GPIO_SetupPinOptions(9, GPIO_INPUT, GPIO_ASYNC);
}
配置完GPIO后,就需要对SCI相关的外设开始配置了。
因为我们用的是一个串行传输数据,必然涉及一个数据格式的配置,这里我们就是常用的串行数据格式:
如同我的上位机(PC)是:数据为8位,无校验位,一个停止位。对应我们的LAUNCHXL的SCI发送的格式也需要如此,这就涉及到对它的SCICCR进行配置,当然由于我们只是简单使用可以,直接对需要的位单个进行配置即可。
如下代码:
SciaRegs.SCICCR.bit.STOPBITS = 0; //0:一个停止位;1:两个停止位
SciaRegs.SCICCR.bit.PARITYENA = 0;//不启动校验位
SciaRegs.SCICCR.bit.SCICHAR = 0x7;//0x0-0x7对应 一位数据位->八位数据位
//上面三句相当于 SciaRegs.SCICCR.all = 0x0007;
其余功能无需配置,因为这里只是简单使用SCI的TX和RX。
除此之外,我们需要需要配置波特率,常用的波特率是115200,19200,9600这是我比较常用的,三个。
波特率的配置涉及到两个寄存器,分别为8位寄存器。
高8位寄存器:SCIHBAUD
低8位寄存器:SCILBAUD
但如何填写了?这里先把官方的列子表给大家看一下:
不过这里LSPCLK=100MHZ,但真实的LSPCLK=50MHZ,
为什么是50MHZ呢,因为设备本身200MHZ的但需要经过一个分频,而默认分配是1/4 所以是50MHZ.
当然如何得到的,需要去看时钟那部分,我们后面补充就行了,现在记住就行。
如果要得到我们需要的115200的波特率,则如下计算:
2400x5207/2/115200=0x0036
SciaRegs.SCIHBAUD.all = 0x0000;
SciaRegs.SCILBAUD.all = 0x0036;
这样我们的波特率也配好了,当然这样并不能正常使用SCI这个外设还需要对控制寄存器简单配置SCICTL1和SCICTL2,并且SCICTL2我们用不到在这里,只需要配置SCICTL1。如下图。
我们这里只会使用SCICTL1的SWRESET(复位状态寄存器和标志位),TXENA,RXENA
SciaRegs.SCICTL1.all = 0x0023;//0000 0000 0010 0011
整合一下就是一个初始化函数:
void SciInitial(void)
{
BspSciGpioInitial();
//SciaRegs.SCICCR.bit.STOPBITS = 0; //0:一个停止位;1:两个停止位
//SciaRegs.SCICCR.bit.PARITYENA = 0;//不启动校验位
//SciaRegs.SCICCR.bit.SCICHAR = 0x7;//0x0-0x7对应 一位数据位->八位数据位
//上面三句相当于
SciaRegs.SCICCR.all = 0x0007;
SciaRegs.SCIHBAUD.all = 0x0000;
SciaRegs.SCILBAUD.all = 0x0036;
SciaRegs.SCICTL1.all = 0x0023; // Relinquish SCI from Reset
}
这章我们只会使用到TX的发送功能,下面是简单的发送函数,原理检测发送准备标志位,如果准备好了,就像TXBUF发送数据,否则一直等待。
void SciWrite(int a)
{
while (SciaRegs.SCICTL2.bit.TXRDY != 1) {}
SciaRegs.SCITXBUF.all =a;
}
下面就是所有代码:
实现内容:向上位机发送0-100的101个数字
#include "F28x_Project.h"
void SciGpioInitial (void)
{
//GPIO8->SCITXDA output
GPIO_SetupPinMux(8, GPIO_MUX_CPU1, 6);
GPIO_SetupPinOptions(8, GPIO_OUTPUT, GPIO_PUSHPULL);
//GPIO9->SCITXRX input
GPIO_SetupPinMux(9, GPIO_MUX_CPU1, 6);
GPIO_SetupPinOptions(9, GPIO_INPUT, GPIO_ASYNC);
}
void SciInitial(void)
{
SciGpioInitial();
SciaRegs.SCICTL1.all = 0x0003;
//SciaRegs.SCICCR.bit.STOPBITS = 0; //0:一个停止位;1:两个停止位
//SciaRegs.SCICCR.bit.PARITYENA = 0;//不启动校验位
//SciaRegs.SCICCR.bit.SCICHAR = 0x7;//0x0-0x7对应 一位数据位->八位数据位
//上面三句相当于
SciaRegs.SCICCR.all = 0x0007;
SciaRegs.SCIHBAUD.all = 0x0000;
SciaRegs.SCILBAUD.all = 0x0036;
SciaRegs.SCICTL1.all = 0x0023;
}
void SciWrite(int a)
{
while (SciaRegs.SCICTL2.bit.TXRDY != 1) {}
SciaRegs.SCITXBUF.all =a;
}
void main(void)
{
InitSysCtrl();
InitGpio();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
SciInitial();
EINT;
int i = 0;
for(;;)
{
SciWrite(i);
i++;
if(i>100)
break;
}
}
上位机结果:
sci的tx发送使用就是这样,篇幅已经有点多了,下次我们就会将rx的使用,可能会涉及中断和FIFO的配置。
总结:这次我和很多人以及官方写得不一样,因为我把很多暂时复杂的功能都舍去了,例如FIFO、中断,就很简单的实现基本的发送功能,但这样方便大家理解这款dsp的sci基本原理以及简单配置。首先是需要对相应GPIO进行所需配置,然后就是SCI的寄存器,数据格式,传输的波特率,控制寄存器的TX,RX的开启。讲得有些模糊,不过大家看代码很快就能明白,下次就是对RX,接收数据的实现。
注:自己的串口调试设备出了点问题,拖得有点久,因为逻辑分析仪可以看到结果,所以我一直在解决我的串口设备问题不好意思各位,如果有问题希望大家指出,有意见或者需要可以在下面评论,我会抽时间及时回复。
参考资料:
[1] TMS320F2837XD Dual-Core Microcontollers Technical Reference Manual