首先,叠加环节:

1.才入门dsp,我的理解和代码可能会有错误,主要供作者本人参考!!!
2.如果您发现我的文章错误请联系我,谢谢。
3.基本所有资料都是从网上查找的,如有侵权,请联系我。

4.我是用的芯片TMS320F280039

一、SCI主要结构

SCI通信:通常称为UART,半双工、全双工、异步。


spi通信格式:
1.空闲线模式。
2.地址线模式,

空闲线通信格式

空闲线模式通过总线空闲时长区分帧类型,而非附加地址位(地址位模式)

接口:

        SCITXDA:数据输出

        SCIRXDA:数据输入

二.SCI配置

1.SCI时钟配置

首先需要使能SCI时钟,这里有SCIA、SCIB的时钟,选择自己需要的时钟使能,一般在官方InitPeripheralClocks函数里有。

 EALLOW;
 CpuSysRegs.PCLKCR7.bit.SCI_A= 1;
 CpuSysRegs.PCLKCR7.bit.SCI_B= 1;
 EDIS;

2. GPIO初始化

查找芯片手册,找对应引脚数的芯片,然后找使用的功能的复用通道。

我使用的是f280039。对应的引脚号:
SCIA_TX对应GPIO17,复用通道6。
SCIA_RX对应GPIO16,复用通道6。

GPIO配置

1.设置功能:rx:复用通道6、输入、上拉、异步      tx:服用通道6、输出、上拉、异步

3.外设时钟分频配置

本芯片的SPI和SCI时钟源都是LSPCLK,在https://blog.csdn.net/X_why/article/details/148453252?sharetype=blogdetail&sharerId=148453252&sharerefer=PC&sharesource=X_why&spm=1011.2480.3001.8118

中已经介绍了如何查看外设时钟以及分频。

EALLOW;
ClkCfgRegs.LOSPCP.bit.LSPCLKDIV =3;  //120mhs/6=20mhs
EDIS;

4.SCI初始化配置

查找数据参考手册SCICCR Register部分,里面有详细的每一位的介绍。

1.通信格式:8位数据、1停止位、无校验、空闲线协议。
2.波特率:根据公式设置。
                本次波特率为115200,LSPCLK为20MHZ,计算出BRR为20.7,四舍五入为21,16进制为0x0015。高八位:0x00,低八位:0x15。

FIFO模式
ScibRegs.SCICTL1.bit.SWRESET = 0;//复位SCI和状态寄存器

//设置通信格式,8位数据、1停止位、无校验、空闲线协议。
SciaRegs.SCICCR.bit.STOPBITS = 0;//0-One stop bit;1-Two stop bits
SciaRegs.SCICCR.bit.PARITY = 0;//0-Odd parity;1-Even parity
SciaRegs.SCICCR.bit.PARITYENA = 0;//0-Parity disable;1-Parity enable
SciaRegs.SCICCR.bit.LOOPBKENA = 0;//0-loopback disable;1-loopback enable
SciaRegs.SCICCR.bit.ADDRIDLE MODE = 0;//0-idle-line;1-address-bit
SciaRegs.SCICCR.bit.SCICHAR = 0x7;//character length 8

//波特率
SciaRegs.SCIHBAUD=0x0000;
SciaRegs.SCILBAUD=0x0015;  //115200

//功能设置
SciaRegs.SCICTL1.bit.RXERRINTENA = 0;//禁用接收错误中断
SciaRegs.SCICTL1.bit.TXWAKE = 0;//禁用TXWAKE功能
SciaRegs.SCICTL1.bit.SLEEP = 0;//禁用SLEEP功能
SciaRegs.SCICTL1.bit.TXENA = 1;//发送使能
SciaRegs.SCICTL1.bit.RXENA = 1;//接收使能
SciaRegs.SCICTL2.bit.RXBKINTENA = 1;//启用接收中断,根据情况自己定
SciaRegs.SCICTL2.bit.TXINTENA = 0;//禁用发送中断,根据情况自己定

SciaRegs.SCIPRI.bit.FREESOFT=2;//自由运行模式:调试断点不影响SPI传输******可以不写****

//FIFO初始化配置
SciaRegs.SCIFFTX.bit.SCIRST = 0;    //全局复位
SciaRegs.SCIFFTX.bit.SCIFFENA = 1;   //FIFO使能

SciaRegs.SCIFFTX.bit.TXFFINTCLR = 1;//清除发送FIFO中断标志位
SciaRegs.SCIFFTX.bit.TXFFINTCLR = 0;//完成清除*****不用写这一步,手册上说写0没有影响****
SciaRegs.SCIFFTX.bit.TXFFIENA = 1;//启用发送FIFO中断
SciaRegs.SCIFFTX.bit.TXFFIL = 0x1;//发送FIFO深度设为1(最大值16)

SciaRegs.SCIFFRX.bit.RXFFOVRCLR = 1;//清除接收FIFO溢出标志位
SciaRegs.SCIFFRX.bit.RXFFOVRCLR = 0;//完成清除
SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1;//清除接收FIFO中断标志位
SciaRegs.SCIFFRX.bit.RXFFIENA = 1;//启用接收FIFO中断
ScibRegs.SCIFFRX.bit.RXFFIL = 0x1;//接收FIFO深度设为1(最大值16)

SciaRegs.SCIFFTX.bit.TXFIFOXRESET = 0; //复位FIFO发送指针
SciaRegs.SCIFFTX.bit.TXFIFOXRESET = 1; //启用FIFO发送
SciaRegs.SCIFFRX.bit.RXFIFORESET = 0;//复位FIFO接收指针
SciaRegs.SCIFFRX.bit.RXFIFORESET = 1;//启用FIFO接收

ScibRegs.SCIFFCT.bit.ABD = 0;//禁用自动波特率检测功能         *****应该不用写****
ScibRegs.SCIFFCT.bit.ABDCLR = 1;//清除ABD标志位              *****应该不用写****
ScibRegs.SCIFFCT.bit.CDC = 0;//禁用ABD对齐                   *****应该不用写****
ScibRegs.SCIFFCT.bit.FFTXDLY = 0;//FIFO延时为0个波特率时钟周期*****应该不用写****

SciaRegs.SCIFFTX.bit.SCIRST = 0;    //全局启用
SciaRegs.SCICTL1.bit.SWRESET = 1;    //启用SCI和状态寄存器




中断+禁用FIFO模式
ScibRegs.SCICTL1.bit.SWRESET = 0;//复位SCI和状态寄存器
//设置通信格式,8位数据、1停止位、无校验、空闲线协议。
SciaRegs.SCICCR.bit.STOPBITS = 0;//0-One stop bit;1-Two stop bits
SciaRegs.SCICCR.bit.PARITY = 0;//0-Odd parity;1-Even parity
SciaRegs.SCICCR.bit.PARITYENA = 0;//0-Parity disable;1-Parity enable
SciaRegs.SCICCR.bit.LOOPBKENA = 0;//0-loopback disable;1-loopback enable
SciaRegs.SCICCR.bit.ADDRIDLE MODE = 0;//0-idle-line;1-address-bit
SciaRegs.SCICCR.bit.SCICHAR = 0x7;//character length 8
//波特率
SciaRegs.SCIHBAUD=0x0000;
SciaRegs.SCILBAUD=0x0015;  //115200
//功能设置
ScibRegs.SCICTL1.bit.RXERRINTENA = 0;//禁用接收错误中断
ScibRegs.SCICTL1.bit.TXWAKE = 0;//禁用TXWAKE功能
ScibRegs.SCICTL1.bit.SLEEP = 0;//禁用SLEEP功能
ScibRegs.SCICTL1.bit.TXENA = 1;//发送使能
ScibRegs.SCICTL1.bit.RXENA = 1;//接收使能

ScibRegs.SCICTL2.bit.RXBKINTENA = 0;//禁用接收中断
ScibRegs.SCICTL2.bit.TXINTENA = 0;//禁用发送中断

SciaRegs.SCIPRI.bit.FREESOFT=2;//自由运行模式:调试断点不影响SPI传输******可以不写*****

ScibRegs.SCICTL1.bit.SWRESET = 1;//启用SCI和状态寄存器

SCI中断配置

1.  PIEgroup9 ,SCIA_RX=INTx.1、SCIA_TX=INTx.1

2.  中断服务函数映射:SciaRxISR、SciaTxISR

    EALLOW;
    IER |= M_INT9;  //  Enable interrupts:
    PieCtrlRegs.PIEIER9.bit.INTx1 = 1;
    PieCtrlRegs.PIEIER9.bit.INTx2 = 1;

    PieVectTable.SCIA_RX_INT = &SciaRxISR;  
    PieVectTable.SCIA_TX_INT = &SciaTxISR;   
    EDIS;
中断服务函数
interrupt void SciaRxISR(void)              //get data from arm
{  
    //接收处理


    EALLOW;
    SciaRegs.SCIFFRX.bit.RXFIFORESET = 0;
    SciaRegs.SCIFFRX.bit.RXFIFORESET = 1;
    SciaRegs.SCIFFRX.bit.RXFFOVRCLR  = 1;   // Clear Overflow flag
    SciaRegs.SCIFFRX.bit.RXFFINTCLR  = 1;   // Clear Interrupt flag
    PieCtrlRegs.PIEACK.all           = PIEACK_GROUP9; // Issue PIE ack
    EDIS;
}

interrupt void SciaTxISR(void)
{
    //发送处理
 
    EALLOW;
    SciaRegs.SCIFFTX.bit.TXFFINTCLR = 1;  // Clear SCI Interrupt flag
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP9; // Issue PIE ACK
    EDIS;

}

附录一:相关资料

1.TMS320F280049C 学习笔记18 串行通信接口 Serial Communications Interface (SCI)_f280039串口-CSDN博客

附录二:代码

/* Includes ------------------------------------------------------------------*/
#include "sci_driver.h"
#include "base_type.h"
#include "SciCom.h"

/* Private typedef -----------------------------------------------------------*/

/* Private define ------------------------------------------------------------*/
#define SCIA_BITRATE                115200
#define SCIB_BITRATE                115200

#define SCI_CONFIG_DEFAULT                      \
{                                               \
    BAUD_RATE_57600,   /* 57600 bits/s */       \
    DATA_BITS_8,        /* 8 databits */        \
    STOP_BITS_1,        /* 1 stopbit */         \
    PARITY_NONE,        /* No parity  */        \
    &SciaRegs,          /* Scia */              \
}

#define BAUD_RATE_2400                  2400
#define BAUD_RATE_4800                  4800
#define BAUD_RATE_9600                  9600
#define BAUD_RATE_19200                 19200
#define BAUD_RATE_38400                 38400
#define BAUD_RATE_57600                 57600
#define BAUD_RATE_115200                115200
#define BAUD_RATE_230400                256000

#define DATA_BITS_5                     5
#define DATA_BITS_6                     6
#define DATA_BITS_7                     7
#define DATA_BITS_8                     8
#define DATA_BITS_9                     9
#define DATA_BITS_10                    10

#define STOP_BITS_1                     0
#define STOP_BITS_2                     1
#define STOP_BITS_3                     2
#define STOP_BITS_4                     3

#define PARITY_NONE                     0
#define PARITY_ODD                      1
#define PARITY_EVEN                     2

typedef struct
{
    u32 BaudRate                        :24;
    u32 DataBits                        :4;
    u32 StopBits                        :2;
    u32 Parity                          :2;
    volatile struct SCI_REGS            *pstSciRegs;
}ST_SCICONFIG_TYPE;

/* Private declaration--------------------------------------------------------*/

/* Private variables ---------------------------------------------------------*/
ST_SCICONFIG_TYPE g_stScia = SCI_CONFIG_DEFAULT;
/* External variables --------------------------------------------------------*/

/* Private function prototypes -----------------------------------------------*/

/* Private user code ---------------------------------------------------------*/

/******************************************************************/
void InitSciaISR()
{
    EALLOW;
    IER |= M_INT9;  //  Enable interrupts:
    PieCtrlRegs.PIEIER9.bit.INTx1 = 1;
    PieCtrlRegs.PIEIER9.bit.INTx2 = 1;

    PieVectTable.SCIA_RX_INT = &SciaRxISR;    // ADCA1_INT中断入口
    PieVectTable.SCIA_TX_INT = &SciaTxISR;    // ADCA1_INT中断入口
    EDIS;
}

/******************************************************************/
/****************
 * GPIO17--->SCIA_RX
 * GPIO16--->SCIA_TX
 * *******************/
static void SciaInit(void)
{

    #if 1
    GPIO_SetupPinMux(GPIONUM_17, GPIO_MUX_CPU1, 6);  
    GPIO_SetupPinOptions(GPIONUM_17, GPIO_INPUT, GPIO_ASYNC|GPIO_PULLUP);
    GPIO_SetupPinMux(GPIONUM_16, GPIO_MUX_CPU1, 6);
    GPIO_SetupPinOptions(GPIONUM_16, GPIO_OUTPUT, GPIO_ASYNC|GPIO_PULLUP);
//    #else
//    GPIO_SetupPinMux(GPIONUM_3, GPIO_MUX_CPU1, GPIO3_SCIARX);
//    GPIO_SetupPinOptions(GPIONUM_3, GPIO_INPUT, GPIO_ASYNC);
//    GPIO_SetupPinMux(GPIONUM_8, GPIO_MUX_CPU1, GPIO8_SCIATX);
//    GPIO_SetupPinOptions(GPIONUM_8, GPIO_OUTPUT, GPIO_ASYNC);

    #endif


    EALLOW;
    ClkCfgRegs.LOSPCP.bit.LSPCLKDIV = 3;       // 120mhs/6=20mhs
    EDIS;

    f32 f32Baudrate = 0;

//    SciaRegs.SCICCR.all = 0x0007;  // 1停止位、无校验、8数据位、空闲线模式

    g_stScia.BaudRate   = BAUD_RATE_115200;
    g_stScia.DataBits   = DATA_BITS_8;
    g_stScia.StopBits   = STOP_BITS_1;
    g_stScia.Parity     = PARITY_NONE;
    g_stScia.pstSciRegs = &SciaRegs;


    f32Baudrate                                     = (20 * FREQUNIT_MHZ) / ((f32)g_stScia.BaudRate * 8) - 1;
//    f32Baudrate                                     = (((f32)CHIP_LSPCLDFREQ) * FREQUNIT_MHZ) / (115200 * 8) - 1;
    EALLOW;
    CpuSysRegs.PCLKCR7.bit.SCI_A                    = 1;

    g_stScia.pstSciRegs->SCICCR.bit.STOPBITS        = g_stScia.StopBits;
    g_stScia.pstSciRegs->SCICCR.bit.PARITYENA       = g_stScia.Parity;                // 8 char bits
    g_stScia.pstSciRegs->SCICCR.bit.SCICHAR         = g_stScia.DataBits - 1;
    g_stScia.pstSciRegs->SCICTL1.all                = 0x0003;                          // enable TX, RX, internal SCICLK,
                                                                                       // Disable RX ERR INT, SLEEP, TXWA
    g_stScia.pstSciRegs->SCIHBAUD.all               = ((u16)f32Baudrate & 0xFF00) >> 8;      // SCI BAUD = LSPCLK(25M)/((BRR+1)*8)
    g_stScia.pstSciRegs->SCILBAUD.all               = ((u16)f32Baudrate) & 0x00FF;          // BRR =  LSPCLK/(SCI BAUD*8)-1  26--115200
//    SciaRegs.SCIHBAUD=0x0000;
//    SciaRegs.SCILBAUD=0x0015;  //115200

    g_stScia.pstSciRegs->SCICTL1.bit.TXENA          = 1;
    g_stScia.pstSciRegs->SCICTL1.bit.RXENA          = 1;

    g_stScia.pstSciRegs->SCIPRI.bit.FREESOFT        = 2;     // don't stop on suspend

    SciaRegs.SCIFFTX.all                            = 0XC061;
    //g_stScia.pstSciRegs->SCIFFTX.all              = 0XC060;// .SCIRST         = 0;     // reset Rx and Tx channels

    g_stScia.pstSciRegs->SCIFFRX.all                = 0x4061;// .bit.RXFFOVRCLR     = 1;     // clear RXOVF bit


    SciaRegs.SCICTL2.bit.RXBKINTENA = 0;
    SciaRegs.SCICTL2.bit.TXINTENA = 0;
    SciaRegs.SCIFFRX.bit.RXFFIENA = 1;//启用接收FIFO中断
    SciaRegs.SCIFFTX.bit.TXFFIENA = 0;//启用接收FIFO中断

    g_stScia.pstSciRegs->SCIFFCT.all                = 0;
    g_stScia.pstSciRegs->SCICTL1.bit.SWRESET        = 1;                                // enable SCI
    g_stScia.pstSciRegs->SCIFFTX.bit.TXFIFORESET    = 1;     // reenable Tx FIFO operation
    g_stScia.pstSciRegs->SCIFFRX.bit.RXFIFORESET    = 1;     // reenable Rx FIFO operation
    g_stScia.pstSciRegs->SCIFFTX.bit.SCIFFENA       = 1;     // FIFO enhancements enabled
    EDIS;
}

/******************************************************************/
void SciInit(void)
{
    InitSciaISR();
    SciaInit();
}

void SciErrorCheck()
{
    if (SciaRegs.SCIRXST.bit.RXERROR)                    // 出现接收故障时处理
    {
        SciInit();

    }

}

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐