DSP

TI C2000 TMS320F28379D SCID SCIB 的配置与使用

2019-07-13 16:44发布

TI的官方例程里面只给了SCIA的配置而没有给其他的SCI的配置方法 其实这些的配置都是一样的,下面以SCIB和SCID的配置为例并结合数据手册说明一下配置过程:至于一些参数为什么要向程序中那样配置可参考F28379的技术手册和博客最后面的截图(当然了也都是在技术手册中截的) 注:程序中红 {MOD}的代表需要注意的部分,其他颜 {MOD}的对应下面相同颜 {MOD}的函数实现方式 /*****************系统配置*****************/
    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.引脚复用 2.中断通道映射: