TMS320F28335: DSP28335与CPLD通讯

Part Number: TMS320F28335

大家好!采用DSP28335通过XINT与CPLD通讯,在通讯过程中发现,DSP在向定义的地址写入数据时,所有地址都有数据,什么原因?下面是配置的完整代码

#include "DSP2833x_Device.h"     // DSP2833x芯片设备头文件
#include "DSP2833x_Examples.h"   // DSP2833x示例代码文件

// 定义控制 LED 的宏
#define LED1_ON   GpioDataRegs.GPASET.bit.GPIO2 = 1   // 点亮 LED1
#define LED1_OFF  GpioDataRegs.GPACLEAR.bit.GPIO2 = 1 // 熄灭 LED1
#define LED2_ON   GpioDataRegs.GPASET.bit.GPIO1 = 1   // 点亮 LED2
#define LED2_OFF  GpioDataRegs.GPACLEAR.bit.GPIO1 = 1 // 熄灭 LED2
//
//// 定义外设地址
//#define ExRamStart          0X4000  // 区域 0 起始地址
//#define IntADD         (*(volatile int16 *)(ExRamStart + 0x000B))  // 读取地址
//#define CntlsADD       (*(volatile int16 *)(ExRamStart + 0x000C))  // 写入地址 1
//#define SentADD        (*(volatile int16 *)(ExRamStart + 0x000F))  // 写入地址 2

 //定义起始地址
Uint16 *ExRamStart = (Uint16 *)0x4000; // 外部RAM起始地址,16位数据存储
#define IntADD    *(volatile Uint16 *)0x400B  // 接收地址
#define IntADD1    *(volatile Uint16 *)0x400C  // 接收地址
#define CntlsADD  *(volatile Uint16 *)0x400D  // 发送地址
#define SentADD  *(volatile Uint16 *)0x400E // 发送地址

// 全局变量
volatile Uint16 sent_data = 0;
volatile Uint16 sent_data1 = 0;
volatile Uint16 received_data = 0;
volatile Uint16 received_data1 = 0;

#define MAX_HISTORY 16             // 定义历史数据的最大数量
volatile Uint16 history_data[MAX_HISTORY];
volatile Uint16 history_index = 0;

// 函数声明
void configtestled(void);
void init_zone0(void);

void main(void)
{
    // 初始化系统
    InitSysCtrl();
    init_zone0();

    // 禁用所有中断
    DINT;
    InitPieCtrl();
    IER = 0x0000;
    IFR = 0x0000;
    InitPieVectTable();

    // 配置 LED GPIO
    configtestled();

    while (1)
    {
        // 写入数据到外设
        CntlsADD = sent_data;
        SentADD = sent_data1;

        DELAY_US(100);  // 确保写入操作稳定

        // 从外设读取数据
        received_data = IntADD;
        received_data1 = IntADD1;
        // 存储历史数据
        history_data[history_index] = received_data;
        history_index = (history_index + 1) % MAX_HISTORY;

        // 根据数据状态控制 LED
        if (received_data == sent_data) {
            LED1_ON;
            LED2_ON;
        } else {
            LED1_OFF;
            LED2_OFF;
        }

        // 更新发送数据,循环变化
        //sent_data = (sent_data + 1) & 0x000F;
        //sent_data1 = (sent_data1 + 1) & 0x00FF;
        sent_data = 0x000F;
        sent_data1 =0x000C;

        DELAY_US(1000);  // 避免循环过快
    }
}

// 配置 LED GPIO
void configtestled(void)
{
    EALLOW;

    GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO2 = 1;
    GpioDataRegs.GPACLEAR.bit.GPIO2 = 1;  // 熄灭 LED1

    GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;
    GpioDataRegs.GPACLEAR.bit.GPIO1 = 1;  // 熄灭 LED2

    EDIS;
}

// 初始化外部存储接口
void init_zone0(void)
{
    InitXintf16Gpio();

    EALLOW;
    XintfRegs.XINTCNF2.bit.XTIMCLK = 1;
    XintfRegs.XINTCNF2.bit.WRBUFF = 3;
    XintfRegs.XINTCNF2.bit.CLKOFF = 0;
    XintfRegs.XINTCNF2.bit.CLKMODE = 1;

    XintfRegs.XTIMING0.bit.XWRLEAD = 2;
    XintfRegs.XTIMING0.bit.XWRACTIVE = 3;
    XintfRegs.XTIMING0.bit.XWRTRAIL = 2;
    XintfRegs.XTIMING0.bit.XRDLEAD = 2;
    XintfRegs.XTIMING0.bit.XRDACTIVE = 3;
    XintfRegs.XTIMING0.bit.XRDTRAIL = 2;
    XintfRegs.XTIMING0.bit.X2TIMING = 0;
    XintfRegs.XTIMING0.bit.USEREADY = 0;
    XintfRegs.XTIMING0.bit.READYMODE = 1;
    XintfRegs.XTIMING0.bit.XSIZE = 3;
    EDIS;

    asm(" RPT #7 || NOP");
}

  • 您好,      

    在通讯过程中发现,DSP在向定义的地址写入数据时,所有地址都有数据

    这不应该发生。

    您是确定信号的范围以检查这一点,还是通过其他一些方法?

    如果确定信号的范围,您能否捕获快照并将其张贴在此处 

  •  您好!非常感谢您回答我的问题,上述图片是Memory Browser中不同地址的数据,其中0X400A~0x400D,是接收CPLD回传的数据,从地址0X400E~到地址0X4010,分别发送的数据为:00AF、000C和0~F的变化的数;地址0X400E,应该为发送的数据00AF,也就是地址0X400C接收到的数据,地址0X400F,应该为发送的数据000C,也就是0X400B接收到的数据,这个数据在CPLD中做了算所以是0011,不是000C;地址0X4010发送的为从0~F的一个变化的数,也就是地址0X400D中接收到数据;地址0X400A是CPLD发送的0~A变化的一个值。通过上述分析,CPLD与DSP通讯没有问题,但是在Memory Browse中对应的写入地址不是定义地址的写入的数据。

  • 您好,

          电路板上似乎存在一些信号完整性问题,需要您确认一下。

  • 您好!

            非常感谢您对我问题的回答,根据您的回答,我先确认是否电路板的问题,或者换一块板子看能否解决上述问题,再次感谢您对我问题的回答!