DSP(TI-C2000)---基于SCI的FIFO接收发送中断(空闲线模式)
本次波特率为115200,LSPCLK为20MHZ,计算出BRR为20.7,四舍五入为21,16进制为0x0015。高八位:0x00,低八位:0x15。首先需要使能SCI时钟,这里有SCIA、SCIB的时钟,选择自己需要的时钟使能,一般在官方InitPeripheralClocks函数里有。1.设置功能:rx:复用通道6、输入、上拉、异步tx:服用通道6、输出、上拉、异步。查找芯片手册,找对应引脚
首先,叠加环节:
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();
}
}
更多推荐



所有评论(0)