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.8027万F:串行中断

Guru**** 2595800 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/665678/compiler-tms320f28027f-serial-interrupt

部件号:TMS320F2.8027万F

工具/软件:TI C/C++编译器

我正在尝试运行示例代码example_2802xSci_FDLB_int.c。  我更改了顶部的CPU频率,并添加了一个条件,如果CPU频率为60 MHz,则将波特率设置为11.52万。 真实术语仍显示垃圾价值。
下面是带有更改的示例代码-

//#######################################################################
//
//文件:F2802x_examples/scia_loopback_interrups/example_F2802xSci_FDLB_int.c.</s>2802
//
//标题:F2802x器件SCI数字回路程序。
//
//组:C2000
//目标器件:TMS320F2802x
//
//! \addtogroup example_list
//! <H1>SCI数字回路,带中断</H1>
//!
//! 此程序是一个使用内部环回的SCI示例
//! 外围设备。 同时使用中断和SCI FIFO。
//!
//! 发送一个数据流,然后将其与接收的数据流进行比较。
//!
//! SCI-A发送的数据如下所示:\n
//! 00 01 \n
//! 01 02 \n
//! 02 03 \n
//! .... \n
//! FE FF \n
//! FF 00 \n
//! 等等。
//!
//! 这种模式将永远重复。
//!
//! 监视变量:
//! - sdataA -正在发送的数据
//! - rdataA -已接收数据
//! - RDATA_pointA -跟踪我们在数据流中的位置。
//! 这用于检查传入的数据
//
//(C)版权所有2012,Texas Instruments,Inc.
//#######################################################################
//$TI发行版:软件包名称$
//$发布日期:软件包发布日期$
//#######################################################################

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

#include "common/include/adc.h"
#include "common / include/clk.h"
#include "common / include/flash.h"
#include "common/include/gPIO.h"
#include "common/include/pie.h"
#include "common/include/pll.h"
#include "common/include/sci.h"
#include "common/include/wdog.h"

#define CPU_FREQ 60E6 //默认= 40 MHz。 对于50 MHz设备,更改为50E6
#define LSPCLK_FREQ CPU_FREQ/4
#define SCI_FREQ 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_init(void);
void scia_fifo_init(void);
void错误(void);

//全局变量
uINT16_t sdataA[2];//发送SCI-A的数据
uINT16_t rdataA[2];//接收到SCI-A的数据
UINT16_t RDATA_pointA;//用于检查接收到的数据

adc_handle myAdc;
clk_handle myClk;
FLASH_HANDLE myFlash;
GPIO _手柄myGpio;
PIE_HANDLE myPIE;
Sci_Handle mySci;

Void主(void)

uINT16_t i;

cpu_handle myCpu;
PLL_HANDLE myPll;
WDOG_Handle myWDog;

//初始化此应用程序所需的所有句柄
myAdc = adc_init((void *)adc_base_addr, sizeof(ADC_Obj);
myClk = clk_init((void *)clk_base_addr, sizeof(clk_obj));
myCpu = CPU_INIT ((void *) NULL,sizeof (CPU_Obj));
myFlash = flash_init((void *)flash_base_addr, sizeof(flash_Obj));
myGpio = gPIO_INIT ((void *) gPIO_BASE ADDR,sizeof (gPIO_Obj));
myPie = PIE_INIT ((void *) PIE_base_ADDR,sizeof (PIE_Obj));
myPll = PLL_INIT ((void *) PLL_base_ADDR,sizeof (PLL_Obj));
mySci = SCI_INIT ((void *) SCIA_base_ADDR,sizeof(SCI_Obj));
myWDog = WDOG_INIT ((void *) WDOG_base_ADDR,sizeof (WDOG_Obj));

//执行基本系统初始化
WDOG_DISABLE (myWDog);
clk_enableAdcClock(myClk);
(*Device_cal)();

//选择内部振荡器1作为时钟源
CLK_setOscSrc (myClk,CLK_OscSrc_Internal);

//为x10 /2设置PLL,其输出频率为50MHz =10MHz *10/ 2
PLL_setup (myPll,PLL_Multiplier_12,PLL_DivideSelect_CLKIN_BY_2);

//禁用PIE和所有中断
PIE_DISABLE (myPie);
PIE_DisableAllInts(myPie);
CPU_disableGlobalInts (myCpu);
CPU_clearIntFlags (myCpu);

//如果从闪存复制运行,则RAM仅对RAM起作用
#ifdef _flash
memcpy (&RamfuncsRunStart,&RamfuncsLoadStart,(size_t)&RamfuncsLoadSize);
#endif

//初始化GPIO
GPIO设置上拉(myGpio,GPIO编号_28,GPIO _上拉_启用);
GPIO设置上拉(myGpio,GPIO编号_29,GPIO _上拉_禁用);
GPIO_setQualification (myGpio,GPIO编号_28,GPIO _Qual_Async);
GPIO_setMode (myGpio,GPIO编号_28,GPIO _28_Mode_SCIRXDA);
GPIO设置模式(myGpio,GPIO编号_29,GPIO _29_Mode_SCITXDA);

//设置调试向量表并启用PIE
PIE_setDebugIntVectorTable(myPie);
PIE_ENABLE (myPie);

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

//在PIE矢量表中注册中断处理程序
PIE_registerPieIntHandler (myPie,PIE_GroupNumber_9,PIE_SubGroupNumber_1,(intVec_t)&sciaRxFifoIsr);
PIE_registerPieIntHandler (myPie,PIE_GroupNumber_9,PIE_SubGroupNumber_2,(intVec_t)&sciaTxFifoIsr);

scia_init();//初始化SCI-A
scia_fifo_init();//初始化SCI-A Fifos

//初始化发送数据。 每次传输后,此数据
//将为下一次传输更新
用于(i = 0;I<2;I++)

sdataA[i]= i;
}

RDATA_pointA = sdataA[0];
//启用此示例所需的中断
PIE_ENableInt (myPie,PIE_GROUPNumber_9,PIE_InterruptSource_SCIARX);
PIE_ENableInt (myPie,PIE_GROUPNumber_9,PIE_InterruptSource_SCIATX);

CPU_enableInt (myCpu,CPU_IntNumber_9);
CPU_enableGlobalInts (myCpu);

用于(;){
}

}

作废错误(void)

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

__interrupt void sciaTxFifoIsr (void)

uINT16_t i;
对于(i=0;i< 2;i++){
//发送数据
sci_putDataBlocking (mySci,sdataA[i]);
}

对于(i=0;i< 2;i++){
//增量发送下一个周期的数据
sdataA[i]=(sdataA[i]+1)和0x00FF;
}

//清除SCI中断标志
sci_clearTxFifoInt (mySci);

//发出PIE ACK
PIE_clearInt (myPie,PIE_GroupNumber_9);

返回;
}

__interrupt void sciaRxFifoIsr (void)

uINT16_t i;

IF(SCI_getRxFifoStatus(mySci)!= SCI_FifoLevel_empty){
对于(i=0;i<2;i++){
//读取数据
rdataA[i]= SCI_getData(mySci);
}
对于(i=0;i<2;i++){
//检查收到的数据
IF (rdataA[i]!=(RDATA_pointA+I)& 0x00FF)
错误();
}

RDATA_pointA =(RDATA_pointA+1)和0x00FF;
}

//清除溢出标志
Sci_clearRxFifoOvf (mySci);

//清除中断标志
sci_clearRxFifoInt(mySci);

//发布饼图
PIE_clearInt (myPie,PIE_GroupNumber_9);

返回;
}

void scia_init()

clk_enableSciaClock(myClk);

// 1停止位,无回送
//无奇偶校验,8个字符位,
//异步模式,空闲线路协议
sci_disableParity (mySci);
Sci_setNumStopBits (mySci,SCI_NumStopBits_One);
Sci_setCharLength (mySci,SCI_CharLength_8_Bits);

//启用TX,RX,内部SCICLK,
//禁用RX ERR,睡眠,TXWAKE
sci_enableTx (mySci);
sci_enablerx (mySci);
sci_enableTxInt(mySci);
sci_enableRxInt(mySci);

sci_enableLoopBack (mySci);

// SCI BRR = LSPCLK/(SCI BAUDIX8)-1
#IF (CPU_FRQ_60MHz)
Sci_setBaudRate (mySci,(SCI_bauderate_e) 15);
#Elif (CPU_FRQ_50MHz)
Sci_setBaudRate (mySci,(SCI_bauderate_e) 15);
#endif

Sci_enable (mySci);

返回;
}

void scia_fifo_init()

sci_enableFifoEnh (mySci);
Sci_resetTxFifo (mySci);
sci_clearTxFifoInt (mySci);
Sci_resetChannels (mySci);
Sci_setTxFifoIntLevel (mySci,SCI_FifoLevel和2_字数);
sci_enableTxFifoInt(mySci);

Sci_resetRxFifo (mySci);
sci_clearRxFifoInt(mySci);
Sci_setRxFifoIntLevel (mySci,SCI_FifoLevel和2_字数);
sci_enableRxFifoInt(mySci);

返回;
}


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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我建议在传输0x55时首先连接一个示波器并测量波特率。 主板是否以正确的波特率传输?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Sci_echoback示例代码工作正常。 因此,它在预定义的波特率下工作非常完美。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    回波使用相同的UART模块进行传输和接收。 换言之,即使波特设置不正确,它仍然有效,因为它们使用相同的波特率发生器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Sarthak,

    您可能需要仔细检查波特设置(注意两个CPU频率的波特设置相同)。 从以上修改的代码:

    // SCI BRR = LSPCLK/(SCI BAUDIX8)-1
    #IF (CPU_FRQ_60MHz)
    Sci_setBaudRate (mySci,(SCI_bauderate_e) 15);
    #Elif (CPU_FRQ_50MHz)
    Sci_setBaudRate (mySci,(SCI_bauderate_e) 15);
    #endif

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

    很抱歉回复太晚。 以下是更新代码。 CPU频率设置为50 MHz。 要将波特率设置为9600,BRR为162。

    //
    //包含的文件
    //
    #include "DSP28x_Project.h"//设备头文件和示例包括文件
    #include <stdio.h>
    #include <file.h>

    #include "common/include/adc.h"
    #include "common / include/clk.h"
    #include "common / include/flash.h"
    #include "common/include/gPIO.h"
    #include "common/include/pie.h"
    #include "common/include/pll.h"
    #include "common/include/sci.h"
    #include "common/include/wdog.h"

    //
    //定义
    //

    //
    //默认= 40 MHz。 对于50 MHz设备,更改为50E6
    //
    #define CPU_FREQ 50E6.
    #define LSPCLK_FREQ CPU_FREQ/4
    #define SCI_FREQ 9600
    #define SCI_PRD (LSPCLK_FREQ/(SCI_FREQ*8))-1

    //
    //函数原型
    //
    __interrupt void sciaTxFifoIsr (void);
    __interrupt void sciaRxFifoIsr (void);
    __interrupt void scibTxFifoIsr (void);
    __interrupt void scibRxFifoIsr (void);
    void scia_init(void);
    void scia_fifo_init(void);
    void错误(void);

    //
    //全局
    //
    uINT16_t sdataA[2];//发送SCI-A的数据
    uINT16_t rdataA[2];//接收到SCI-A的数据
    UINT16_t RDATA_pointA;//用于检查接收到的数据

    adc_handle myAdc;
    clk_handle myClk;
    FLASH_HANDLE myFlash;
    GPIO _手柄myGpio;
    PIE_HANDLE myPIE;
    Sci_Handle mySci;

    //
    //主菜单
    //
    Void主(void)

    uINT16_t i;

    cpu_handle myCpu;
    PLL_HANDLE myPll;
    WDOG_Handle myWDog;

    //
    //初始化此应用程序所需的所有句柄
    //
    myAdc = adc_init((void *)adc_base_addr, sizeof(ADC_Obj);
    myClk = clk_init((void *)clk_base_addr, sizeof(clk_obj));
    myCpu = CPU_INIT ((void *) NULL,sizeof (CPU_Obj));
    myFlash = flash_init((void *)flash_base_addr, sizeof(flash_Obj));
    myGpio = gPIO_INIT ((void *) gPIO_BASE ADDR,sizeof (gPIO_Obj));
    myPie = PIE_INIT ((void *) PIE_base_ADDR,sizeof (PIE_Obj));
    myPll = PLL_INIT ((void *) PLL_base_ADDR,sizeof (PLL_Obj));
    mySci = SCI_INIT ((void *) SCIA_base_ADDR,sizeof(SCI_Obj));
    myWDog = WDOG_INIT ((void *) WDOG_base_ADDR,sizeof (WDOG_Obj));

    //
    //执行基本系统初始化
    //
    WDOG_DISABLE (myWDog);
    clk_enableAdcClock(myClk);
    (*Device_cal)();

    //
    //选择内部振荡器1作为时钟源
    //
    CLK_setOscSrc (myClk,CLK_OscSrc_Internal);

    //
    //为x10 /2设置PLL,其输出频率为50MHz =10MHz *10/ 2
    //
    PLL_setup (myPll,PLL_Multiplier_10,PLL_DivideSelect_CLKIN_BY_2);

    //
    //禁用PIE和所有中断
    //
    PIE_DISABLE (myPie);
    PIE_DisableAllInts(myPie);
    CPU_disableGlobalInts (myCpu);
    CPU_clearIntFlags (myCpu);

    //
    //如果从闪存复制运行,则RAM仅对RAM起作用
    //
    #ifdef _flash
    memcpy (&RamfuncsRunStart,&RamfuncsLoadStart,(size_t)&RamfuncsLoadSize);
    #endif

    //
    //初始化GPIO
    //
    GPIO设置上拉(myGpio,GPIO编号_28,GPIO _上拉_启用);
    GPIO设置上拉(myGpio,GPIO编号_29,GPIO _上拉_禁用);
    GPIO_setQualification (myGpio,GPIO编号_28,GPIO _Qual_Async);
    GPIO_setMode (myGpio,GPIO编号_28,GPIO _28_Mode_SCIRXDA);
    GPIO设置模式(myGpio,GPIO编号_29,GPIO _29_Mode_SCITXDA);
    // gPIO_setMode (myGpio,gPIO_NUMBER_18,gPIO_18_Mode_XCLKOUT);
    // CLK_setClkOutPreScaler(myClk, CLK_ClkOutPreScaler_SYSCLKOUT_BY_4);

    //
    //设置调试向量表并启用PIE
    //
    PIE_setDebugIntVectorTable(myPie);
    PIE_ENABLE (myPie);

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

    //
    //在PIE矢量表中注册中断处理程序
    //
    PIE_registerPieIntHandler (myPie,PIE_GroupNumber_9,PIE_SubGroupNumber_1,
    (intVec_t)&sciaRxFifoIsr);
    PIE_registerPieIntHandler (myPie,PIE_GroupNumber_9,PIE_SubGroupNumber_2,
    (intVec_t)&sciaTxFifoIsr);

    scia_init();//初始化SCI-A
    scia_fifo_init();//初始化SCI-A Fifos

    //
    //初始化发送数据。 每次传输后,将更新此数据
    //下一个传输
    //
    用于(i = 0;I<2;I++)

    sdataA[i]= i;
    }

    RDATA_pointA = sdataA[0];

    //
    //启用此示例所需的中断
    //
    PIE_ENableInt (myPie,PIE_GROUPNumber_9,PIE_InterruptSource_SCIARX);
    PIE_ENableInt (myPie,PIE_GROUPNumber_9,PIE_InterruptSource_SCIATX);

    CPU_enableInt (myCpu,CPU_IntNumber_9);
    CPU_enableGlobalInts (myCpu);

    对于(;;)


    }
    }

    //
    //错误-
    //
    作废错误(void)

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


    }
    }

    //
    // sciaTxFifoIsr -
    //
    __中断无效
    SciaTxFifoIsr (无效)

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

    //
    //发送数据
    //
    // SCI_putDataBlocking (mySci,sdataA[i]);
    }

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

    //
    //为下一个周期递增发送数据
    //
    sdataA[i]=(sdataA[i]+1)和0x00FF;
    }

    //
    //清除SCI中断标志
    //
    sci_clearTxFifoInt (mySci);

    //
    //发出PIE ACK
    //
    PIE_clearInt (myPie,PIE_GroupNumber_9);

    返回;
    }

    //
    // sciaRxFifoIsr -
    //
    __中断无效
    SciaRxFifoIsr (无效)

    uINT16_t i;

    IF (SCI_getRxFifoStatus(mySci)!= SCI_FifoLevel_empty)

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

    //
    //读取数据
    //
    rdataA[i]= SCI_getData(mySci);
    }

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

    //
    //检查收到的数据
    //
    IF (rdataA[i]!=(RDATA_pointA+I)& 0x00FF)

    //错误();
    }
    }

    RDATA_pointA =(RDATA_pointA+1)和0x00FF;
    }

    //
    //清除溢出标志
    //
    Sci_clearRxFifoOvf (mySci);

    //
    //清除中断标志
    //
    sci_clearRxFifoInt(mySci);

    //
    //发布饼图
    //
    PIE_clearInt (myPie,PIE_GroupNumber_9);

    返回;
    }

    //
    // scia_init -
    //
    无效
    scia_init()

    clk_enableSciaClock(myClk);

    //
    // 1停止位,无回送,无奇偶校验,8个字符位,异步模式
    //空闲线路协议
    //
    sci_disableParity (mySci);
    Sci_setNumStopBits (mySci,SCI_NumStopBits_One);
    Sci_setCharLength (mySci,SCI_CharLength_8_Bits);

    //
    //启用TX,RX,内部SCICLK,禁用RX ERR,睡眠, TXWAKE
    //
    sci_enableTx (mySci);
    sci_enablerx (mySci);
    sci_enableTxInt(mySci);
    sci_enableRxInt(mySci);

    sci_enableLoopBack (mySci);

    //SCI BRR = LSPCLK/(SCI BAUDIX8)-1.
    #IF (CPU_FRQ_50MHz)
    Sci_setBaudRate (mySci,(SCI_bauderate_e) 162);
    #Elif (CPU_FRQ_40MHz)
    Sci_setBaudRate (mySci,(SCI_bauderate_e) 129);
    #endif

    Sci_enable (mySci);

    返回;
    }

    //
    // scia_fifo_init -
    //
    无效
    scia_fifo_init()

    sci_enableFifoEnh (mySci);
    Sci_resetTxFifo (mySci);
    sci_clearTxFifoInt (mySci);
    Sci_resetChannels (mySci);
    Sci_setTxFifoIntLevel (mySci,SCI_FifoLevel和2_字数);
    sci_enableTxFifoInt(mySci);

    Sci_resetRxFifo (mySci);
    sci_clearRxFifoInt(mySci);
    Sci_setRxFifoIntLevel (mySci,SCI_FifoLevel和2_字数);
    sci_enableRxFifoInt(mySci);

    返回;
    }

    //
    //文件结束
    //

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

    您只向我发送了您的更新代码,但未提供任何有关结果的其他信息。 您的代码是否以40 MHz的默认频率工作? 您是否可以获得未经修改的原始代码来工作?

    - Ken
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Ken
    通过Tx ISR发送命令时,无论使用何种频率,我都可以打印,但通过PuTTY发送命令时没有任何反应。 如果是TX ISR,是否必须进行一些更改才能通过串行接收命令?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当我通过puttuy发送命令时,TX线而不是Rx线闪烁。 如何解决这一问题?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Sarthak,

    原始未经修改的程序是否有效? 我想了解问题是代码还是其他(PuTTY)。

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

    距离我们上次听到您的消息已有几个星期了。 因此,我们假设您能够解决您的问题。 如果不是这种情况,请拒绝此解决方案或回复此线程。 如果此线程锁定,请创建一个新线程,描述您的问题的当前状态。 谢谢你。

    - Ken