[分享] TMS320F28379D SCID SCIB 的配置与使用

Jacktang   2020-12-18 21:58 楼主

        TI的官方例程里面只给了SCIA的配置而没有给其他的SCI的配置方法 其实这些的配置都是一样的,下面以SCIB和SCID的配置为例并结合数据手册说明一下配置过程:至于一些参数为什么要向程序中那样配置可参考F28379的技术手册和博客最后面的截图(当然了也都是在技术手册中截的)

注:程序中红色的代表需要注意的部分,其他颜色的对应下面相同颜色的函数实现方式

/*****************系统配置*****************/
    InitSysCtrl();        // 初始化系统

    InitGpio();            // 初始化GPIO

   SciIOCfg();            // 初始化SCI   引脚的初始化

    /*中断配置*/ 
    DINT; //关闭所有中断
    InitPieCtrl();  //初始化PIE 控置寄存器到它们的默认状态。默认所有 PIE 被清除
    //失能所有的CPU中断 并清除所有的CPU中断标志:
    IER = 0x0000;
    IFR = 0x0000;
    InitPieVectTable();//用指向shell中断服务例程(ISR)的指针来初始化PIE 向量表。

    /*中断向量配置*/
    EALLOW;
    PieVectTable.SCIB_RX_INT = &scibRxFifoIsr;        //串口B接收中断
    PieVectTable.SCID_RX_INT = &scidRxFifoIsr;      //串口D接收中断

    EDIS;

    /*SCI带FIFO接收中断*/
    scib_fifo_init();                     //初始化SCI_B 的FIFO
    scid_fifo_init();                    //初始化SCI_D 的FIFO

    PieCtrlRegs.PIECTRL.bit.ENPIE = 1;   // Enable the PIE block

    PieCtrlRegs.PIEIER9.bit.INTx3 = 1;   // PIE Group 9, INT3,配置sciB 接收中断使能*/
    PieCtrlRegs.PIEIER8.bit.INTx7 = 1;   // PIE Group 8, INT7,配置sciD 接收中断使能*/

    IER |= M_INT9|M_INT8;                // Enable CPU INT
    EINT;   //启用全局中断INTM

 

下面结合上面的代码对配置过程进行详解:

首先是其中SCI初始化函数的配置程序:

1.SciIOCfg();

void SciIOCfg(void)
{
    /*SCIB:配置GPIO为上拉和复用功能*/ //注意这里端口引脚的复用需要找数据表中 GPIO Muxed Pins端口复用引脚的第几种复用方式 SCIB为2
    //RX--P19
    GPIO_SetupPinMux(19, GPIO_MUX_CPU1, 2);
    GPIO_SetupPinOptions(19, GPIO_INPUT, GPIO_PULLUP);  //这里应该是GPIO_PULLUP ->1  例程错误 原本例程为GPIO_PUSHPULL ->0  正确应该是GPIO_PULLUP 启用上拉
    //TX--18
    GPIO_SetupPinMux(18, GPIO_MUX_CPU1, 2);
    GPIO_SetupPinOptions(18, GPIO_OUTPUT, GPIO_ASYNC);

    /*SCID:配置GPIO为上拉和复用功能*/ //注意这里端口引脚的复用需要找数据表中 GPIO Muxed Pins端口复用引脚的第几种复用方式 SCID为6
    //RX--P105
    GPIO_SetupPinMux(105, GPIO_MUX_CPU1, 6);
    GPIO_SetupPinOptions(105, GPIO_INPUT, GPIO_PULLUP);
    //TX--104
    GPIO_SetupPinMux(104, GPIO_MUX_CPU1, 6);
    GPIO_SetupPinOptions(104, GPIO_OUTPUT, GPIO_ASYNC);

}

 

FIFO初始化函数:scib_fifo_init();      (当然SCID只需把程序中的scib改成scid即可 这里不赘述SCID)

void scib_fifo_init(void)
{
    ScibRegs.SCICCR.all = 0x0007;              // 一个停止位 无回环
                                            // 无奇偶校验位 ,8个字符位 ,
                                                  // async (空闲线)模式, 空闲线协议
    ScibRegs.SCICTL1.all = 0x0003;             // 使能 TX, RX, 内部 SCICLK(SCI时钟),
                                                  // Disable RX ERR, SLEEP, TXWAKE
    //波特率高低位
    ScibRegs.SCIHBAUD.all = 0x0000;
    ScibRegs.SCILBAUD.all = SCI_PRD;        // 配置波特率为SCI_PRD

    ScibRegs.SCIFFTX.all = 0xE040;        // 使能SCI的FIFO功能,重置SCI,发送重置

    ScibRegs.SCIFFRX.bit.RXFFIENA = 1;        // 使能SCI FIFO发送功能
    ScibRegs.SCIFFRX.bit.RXFFIL = RXNUM;    // 设定接受位数为RXNUM 0h-10h
    ScibRegs.SCIFFRX.bit.RXFFINTCLR =1;        // FIFO计数中断标志位清零

    ScibRegs.SCIFFCT.all = 0x00;

    ScibRegs.SCICTL1.all = 0x0023;             // 重启sci
    ScibRegs.SCIFFRX.bit.RXFIFORESET = 1;    // 重启sci接收fifo
}

 

至于波特率的配置就需要对照官方例程了,注意:时钟为200兆时才正确 如何计算可以在技术手册中找到哦!SCI的官方例程中也是这样计算的

//波特率计算方式
#define CPU_FREQ           200E6
#define LSPCLK_FREQ     CPU_FREQ/4
#define SCI_FREQ        115200
#define SCI_PRD         (LSPCLK_FREQ/(SCI_FREQ*8))-1

 

附图 :

1.引脚复用

image.png

2.中断通道映射:

image.png

回复评论 (1)

感谢分享!

点赞  2020-12-19 11:20
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复