This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F2.8035万:使用Sci使用SCIFF发送数据块

Guru**** 2124260 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/574139/tms320f28035-using-sci-to-send-a-block-of-data-using-sciff

部件号:TMS320F2.8035万

我是TI工具系列的新用户,一直在尝试从主程序发送字符块,并让TXFFINT加载或重新加载FIFO,直到发送该块,然后禁用中断。

目前我可以发送一个64字节块,但是一旦执行EINT指令,传输就会开始。 我需要发送SCI,然后在启用SCI时开始传输。  

PIE和SCI之间的初始化顺序不正确。 这是我的当前代码。

//###################################################################
//
//! \addtogroup F2803x_example_list
//! <H1>SCI数字回路与中断(scia_looping_interrupts)</H1>
//!
//! 此程序使用外围设备的内部回路测试模式。
//! 除引导模式引脚配置外,没有其它硬件配置
//! 是必需的。 同时使用中断和SCI FIFO。
//!
//! 发送数据流,然后与接收的数据流进行比较。
//! SCI-A发送的数据如下所示:\n
//! 00 01 \n
//! 01 02 \n
//! 02 03 \n
//! .... \n
//! FE FF \n
//! FF 00 \n
//! 等等。 \n
//! 这种模式将永远重复。
//!
//! \b监视变量\n
//! -\b/sdataA -正在发送的数据
//! -\b"rdataA"-已接收数据
//! -\b\RDATA_pointA -跟踪我们在数据流中的位置。
//! 这用于检查传入的数据
//
//###################################################################
//$TI发行版:F2803x C/C++头文件和外设示例V130 $
//$发布日期:2015年5月8日$
//$Copyright:版权所有(C) 2009-2015 Texas2015 Texas Instruments Incorporated -
// http://www.ti.com/ 保留所有权利$
//###################################################################

#include "DSP28x_Project.h"//设备头文件和示例包括文件

#define CPU_FREQ 60E6.
#define LSPCLK_FREQ CPU_FREQ/4
#define SCI_FREQ 11.52万// dtr 100E3
#define SCI_PRD (LSPCLK_FREQ/(SCI_FREQ*8))-1

//本文件中找到的函数的prototype语句。
__interrupt void sciaTxFifoIsr (void);
__interrupt void sciaRxFifoIsr (void);
__interrupt void scibTxFifoIsr (void);
__interrupt void scibRxFifoIsr (void);
void scia_fifo_init(void);
void scib_fifo_init(void);
void错误(void);

void SDV2InitSysCtrl(void);


//全局变量
#define buffer_size (64)
UINT16 sdataA[64];//发送SCI-A的数据
UINT16 rdataA[64];//收到的SCI-A数据

UINT16 x = 1;
Void主(void)

UINT16 I;

//步骤1. 初始化系统控制:
// PLL,看门狗,启用外设时钟
//此示例函数位于DSP2803x_sysctrl.c文件中。
InitSysCtrl();

//步骤2. 初始化GPIO:
//此示例函数可在DSP2803x_GPIO.c文件和中找到
//说明了如何将GPIO设置为其默认状态。
// InitGpio();
//仅为SCI-A和SCI-B功能设置GP I/O
//此函数位于DSP2803x_Sci.c中
InitSciaGpio();

//步骤3. 清除所有中断并初始化PIE矢量表:
//禁用CPU中断
色调;

//将PIE控制寄存器初始化到其默认状态。
//默认状态是禁用所有PIE中断和标志
//被清除。
//此函数位于DSP2803x_PIECTRL.c文件中。
InitPieCtrl();

//禁用CPU中断并清除所有CPU中断标志:
IER = 0x0000;
IFR = 0x0000;

//使用指向外壳中断的指针初始化PIE矢量表
//服务例程(ISR)。
//这将填充整个表,即使中断也是如此
//在本例中不使用。 这对于调试非常有用。
// shell ISR例程可在DSP2803x_DefaultIsr.C.中找到
//此函数位于DSP2803x_PieVect.C.中
InitPieVectorTable();

//本示例中使用的中断被重新映射到
//此文件中找到ISR函数。
EALLOW;//这是写入EALLOW保护寄存器所必需的
PieVectorTable.SCIRXINTA =&sciaRxFifoIsr;
PieVectorTable.SCITXINTA =&sciaTxFifoIsr;
EDIS;//这是禁用写入EALLOW保护寄存器所必需的

//步骤4. 初始化所有设备外围设备:
scia_fifo_init();//初始化SCI-A

//步骤5. 用户特定代码,启用中断:

//启用此示例所需的中断
PieCtrlRegs.PIECTRL.bit.ENPIE =1;//启用PIE块
PieCtrlRegs.PIEIER9.bit.INTx1=1;// PIE组9,INT1
PieCtrlRegs.PIEIER9.bit.INTx2=1;// PIE组9,INT2

IER || M_INT9;//启用CPU INT
EINT;

//步骤6。 空闲循环。 只需坐下来永远循环(可选):
for (;;);
}

作废错误(void)

_ASM (" ESTOP0");//测试失败!! 停止!
(;;);
}

__interrupt void sciaTxFifoIsr (void)

UINT16 I;
静态UINT16已发送= 0;

对于(i=0;i< 2;i++)

SciaRegs.SCITXBUF=sdataA[ SENT+++ I];//发送数据
}

if( sent < buffer_size )

SciaRegs.SCIFFTX.Bit.TXFFINTCLR=1;//清除SCI中断标志
PieCtrlRegs.PIEACK.all|=0x100;//发出PIE ACK
}
否则

已发送= 0;
对于(i = 0;i <buffer_size;i++)

sdataA[i]= 0;
}
SciaRegs.SCIFFTX.Bit.TXFFINTCLR=1;//清除SCI中断标志
PieCtrlRegs.PIEACK.all|=0x100;//发出PIE ACK
}
}

__interrupt void sciaRxFifoIsr (void)

UINT16 I,已接收= 0;

IF (x == 1)

X = 0;
返回;
}


对于(i=0;i<2;i++)

rdataA[i]=SciaRegs.SCIRXBUF.all;//读取数据]
}
IF (Received < buffer_size)(收到<缓冲大小)

已收到+=2;
}
否则

已接收= 0;
}

SciaRegs.SCIFFRX.Bit.RXFFOVRCLR=1;//清除溢出标志
SciaRegs.SCIFFRX.Bit.RXFFINTCLR=1;//清除中断标志

PieCtrlRegs.PIEACK.all|=0x100;//发出pie ack
}

void scia_fifo_init()

SciaRegs.SCICCR.ALL = 0x0007;// 1停止位,无回送
//无奇偶校验,8个字符位,
//异步模式,空闲线路协议
SciaRegs.SCICTL1.all = 0x0003;//启用TX,RX,内部SCICLK,
//禁用RX ERR,睡眠,TXWAKE
SciaRegs.SCICTL2.bit.TXINTENA =1;
SciaRegs.SCICTL2.bit.RXBKINTENA =1;
SciaRegs.SCIHBAUD = 0x0000;
SciaRegs.SCILBAUD = SCI_PRD;
SciaRegs.SCICCR.bit.LOOPBKENA =1;//启用回路
SciaRegs.SCIFFTX.All=0xC022;
SciaRegs.SCIFFRX.all=0x0022;
SciaRegs.SCIFFCT.All=0x00;

SciaRegs.SCICTL1.all =0x0023;//从重置放弃SCI
SciaRegs.SCIFFTX.Bit.TXFIFOXRESET=1;
SciaRegs.SCIFFRX.Bit.RXFIFORESET=1;


}

//===========================================================================================================================================
//没有更多。
//===========================================================================================================================================

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    戴尔,

    EINT是全局中断启用,当执行此指令时,您已经完全配置了中断,因此 它们能够传播到CPU。 有关外设中断扩展(PIE)的说明,您应该参阅 《系统控制和中断参考指南》的图78。

    启用FIFO增强功能后,只要 TXFFST的值低于TXFFIL,就会触发SCITXINT中断,此时您可以加载FIFO以及要发送的值。(详细信息可在 SCI 用户指南中找到) 将SCI模块视为独立于CPU, 此中断是SCI模块,请求CPU向SCI模块发送更多数据。 如果要禁用中断,在没有要发送的数据的较长时间内,则只需在PIEIER10中禁用10.2 即可。 这在上文链接的第一份文件的第8节中有详细说明。

    希望它有所帮助!
    科迪

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    戴尔,
    您是否能够解决此问题?

    此致,
    科迪