DSP相关笔记_5:LaunchXL-F28379D的简单教程系列(四)SCI简单使用_1

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

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值